2016-02-09 5 views
3

Это может быть глупый вопрос и очень простой, но я очень отвлекаюсь прямо сейчас и не нашел никакого решения.Установите максимальное значение группы для каждой группы.

У меня есть таблица вроде этого:

ID | Value | Gr_Id | Gr_Value 
------------------------------ 
a |0  |1  |Null 
b |2  |2  |Null 
c |4  |2  |Null 
d |1  |3  |Null 
e |3  |4  |Null 
f |3  |4  |Null 
g |2  |5  |Null 
h |3  |5  |Null 

Желаемая Выход:

ID | Value | Gr_Id | Gr_Value 
------------------------------ 
a |0  |1  |0 
b |2  |2  |4 
c |4  |2  |4 
d |1  |3  |1 
e |3  |4  |3 
f |3  |4  |3 
g |2  |5  |3 
h |3  |5  |3 

Так я хочу, чтобы обновить значение группы и установить максимальное значение group_id. Спасибо.

ответ

1

Я думаю, что это решит вашу проблему:

SELECT ID, Value, Gr_Id, (
      SELECT MAX(Value) 
      FROM tableName t2 
      WHERE t1.Gr_Id = t2.Gr_Id 
) as Gr_Value 
FROM tableName t1 

Попробуйте его; надеюсь, что это помогает

1

Использование OUTER APPLY вы можете сделать это

SELECT ID,Value,Gr_Id,M.Gr_Value 
FROM URTable 
OUTER APPLY 
(
SELECT MAX (Value) as Gr_Value 
FROM URTable tmp 
WHERE tmp.Gr_Id=URTable.Gr_Id 
)M 
0

Это следует сделать это:

UPDATE MyTable --whatever your table is called 
SET Gr_Value = MaxValues.Value 
FROM MyTable 
INNER JOIN (
    SELECT Gr_Id, MAX(Value) AS Value 
    FROM MyTable 
    GROUP BY Gr_Id) AS MaxValues ON MaxValues.Gr_Id = MyTable.Gr_Id 
0
create table Gtable(ID varchar, Value int , Gr_Id int, Gr_Value int) 
Insert into Gtable Values('a', 0, 1, null) 
Insert into Gtable Values('b', 2, 2, null) 
Insert into Gtable Values('c', 4, 2, null) 
Insert into Gtable Values('d', 1, 3, null) 
Insert into Gtable Values('e', 3, 4, null) 
Insert into Gtable Values('f', 3, 4, null) 
Insert into Gtable Values('g', 2, 5, null) 
Insert into Gtable Values('h', 3, 5, null) 

select A.Id, A.Value, A.Gr_Id, C.maxV Gr_Value from Gtable A 
JOIN 
    ( select A.Gr_Id, max(B.Value) maxV from 
      (select Distinct Gr_Id from Gtable) A 
       JOIN Gtable B On A.Gr_Id=B.Gr_Id 
       Group by A.Gr_Id 
       ) C 
       On A.Gr_Id=C.Gr_Id 

Id Value Gr_Id Gr_Value 
a 0 1 0 
b 2 2 4 
c 4 2 4 
d 1 3 1 
e 3 4 3 
f 3 4 3 
g 2 5 3 
h 3 5 3 
1

Попробуйте это с помощью общего табличного выражения:

CREATE TABLE #t 
(ID char,Value int, Gr_Id int, gr_value int) 

INSERT #t(id, value, gr_id) 
values 
('a',0,1),('b',2,2),('c',4,2),('d',1,3), 
('e',3,4),('f',3,4),('g',2,5),('h',3,5) 

;WITH CTE as 
(
    SELECT 
    gr_value, 
    max(value) over(partition by gr_id) max_gr_value 
    FROM #t 
) 
UPDATE CTE SET gr_value = max_gr_value 

SELECT * FROM #t 

Результат:

ID Value Gr_Id Gr_value 
a 0  1  0 
b 2  2  4 
c 4  2  4 
d 1  3  1 
e 3  4  3 
f 3  4  3 
g 2  5  3 
h 3  5  3 
0

Запрос

UPDATE t1 
SET t1.Gr_Value = t2.val 
FROM tblGroup t1 
JOIN (SELECT Gr_Id, MAX(Value) AS val FROM tblGroup GROUP By Gr_Id) t2 
ON t1.Gr_Id = t2.Gr_Id; 
Смежные вопросы