2017-02-23 75 views
1

У меня есть таблица, как этотобновить все строки таблицы на основе минимального значения своей группы

Date----- ----------Value--------- Group <br> 
2017-01-01--------10--------------1--<br> 
2017-01-02---------9---------------1--<br> 
2017-01-03 --------5---------------2--<br> 
2017-01-04 --------4---------------2--<br> 

я хочу, чтобы обновить все столбец значений в таблице таким образом, что он установлен на минимальное значение даты в том, что группа

как этот

Date----- ----------Value--------- Group <br> 
2017-01-01--------10--------------1--<br> 
2017-01-02---------10---------------1--<br> 
2017-01-03 --------5---------------2--<br> 
2017-01-04 --------5---------------2--<br> 

ответ

0

Здесь вы идете, 2 подзапросы, первый для расчета даты мин в каждой группе затем присоединиться обратно к исходной таблице, чтобы получить соответствующее значение. Тогда, наконец, присоединиться к этому к исходной таблице, чтобы обновить все связанные с ним группы с этим значением:

UPDATE M SET M.Value = RESULT.Value FROM MyTable M 
INNER JOIN (
    SELECT MV.Group, M.Value FROM MyTable M 
    INNER JOIN (
     SELECT MIN(Date) as MinDateValue, Group FROM MyTable 
     GROUP BY Group 
      ) MV ON MV.MinDateValue = M.Date AND MV.Group = M.Group 
) RESULT ON RESULT.Group = M.Group 
+0

Привет .. Спасибо за ответ .. но мне нужно обновить значение минимальной даты, а не минимальное значение .. –

+0

@AbijithDas проверить мой выбор, что именно то, что делает запрос – CSL

0
First get min date and value from sub query.Based on this result update main table 

CREATE TABLE #Table(_Date Date,value INT,_Group INT) 

INSERT INTO #Table(_Date ,value ,_Group) 
SELECT '2017-01-01',10,1 UNION ALL 
SELECT '2017-01-02',9,1 UNION ALL 
SELECT '2017-01-03',5,2 UNION ALL 
SELECT '2017-01-04',4,2 

UPDATE #Table SET value = _Output._Value 
FROM 
(
    SELECT A._Date , A._Group , T.value _Value 
    FROM #Table T 
    JOIN 
    (
    SELECT MIN(_Date) _Date ,_Group 
    FROM #Table 
    GROUP BY _Group 
) A ON A._Date = T._Date 

) _Output WHERE _Output._Group = #Table._Group 

SELECT * FROM #Table 
0

Вы также можете использовать CTE.

Запрос

;with cte as(
    select [rn] = row_number() over(
     partition by [Group] 
     order by [Date] 
    ), * 
    from [your_table_name] 
) 
update t1 
set t1.[Value] = t2.[Value] 
from cte t1 
join cte t2 
on t1.[Group] = t2.[Group] 
and t1.[rn] > t2.[rn]; 
Смежные вопросы