Tsql更新具有相同ID和最新日期的行

时间:2015-02-18 09:38:43

标签: sql sql-server tsql

如何使用相同的ID2和最新日期更新行U.我可以编写select子句:

SELECT  ID2
        , MAX(Date)
FROM    TABLE
GROUP BY    ID2

但我有更新条款的问题。

我有桌子:

ID1 |ID2    |Date       |U
1    1       2015-02-18  NULL 
2    1       2015-02-11  NULL
3    2       2015-02-17  NULL
4    2       2015-02-14  NULL
5    2       2015-02-11  NULL
6    3       2015-02-14  NULL
7    3       2015-02-10  NULL

我想要实现的目标:

ID1 |ID2    |Date       |U
1    1       2015-02-18  Update 
2    1       2015-02-11  NULL
3    2       2015-02-17  Update 
4    2       2015-02-14  NULL
5    2       2015-02-11  NULL
6    3       2015-02-14  Update 
7    3       2015-02-10  NULL

3 个答案:

答案 0 :(得分:2)

我将使用CTERow_Number window function

进行此操作
;with cte as
(
select ID1 ,ID2 ,Date ,U, Row_Number() over(partition by ID2 order by Date desc) rn 
From Yourtable
)
update Cte set U = 'Update'
where RN=1

如果每个tie的{​​{1}}日期为max,请使用ID2更新这两个记录。

Dense_rank

答案 1 :(得分:0)

一种方法是使用SELECT ... MAX查询来过滤TABLE。像这样的东西;

UPDATE T SET U = 'UPDATE' 
FROM T JOIN (
SELECT  ID2
        , MAX(Date) AS MaxDate
FROM    TABLE
GROUP BY    ID2) AS X ON X.ID2 = T.ID2 AND X.MaxDate = T.Date

关于这种方法需要注意的一点是,如果每个ID2的最大日期超过1条记录,那么所有具有最大日期的记录都将被更新。

答案 2 :(得分:0)

实现这一目标的有趣方式:

UPDATE T1
SET T1.U='Update'
FROM TestTable T1
WHERE 0=(SELECT COUNT(1) FROM TestTable T2 WHERE T1.ID2=T.ID2 AND T1.Date<T2.Date)