我有一张这样的表:
id start end
------------------------------
1 2013-04-08 null
2 2013-04-01 null
2 2012-04-01 2013-04-01
3 2012-04-01 2013-04-01
4 2012-04-01 2013-04-01
4 2011-04-01 2012-04-01
我想得到这样一张桌子:
id start end
-----------------------------
1 2013-04-08 null
2 2013-04-01 null
3 2012-04-01 2013-04-01
4 2012-04-01 2013-04-01
所以我希望每个id都能获得一行,并提供最新信息。
如何编写查询?
答案 0 :(得分:4)
SQL Server
支持Common Table Expression
和Windowing Functions
。 ROW_NUMBER()
对每个组的记录进行排名,这是过滤记录的基础。
WITH records
AS
(
SELECT ID, [Start], [End],
ROW_NUMBER() OVER(PARTITION BY ID ORDER BY [START] DESC) rn
FROM TableName
)
SELECT ID, [Start], [End]
FROM records
WHERE rn = 1
答案 1 :(得分:1)
作为对J W答案的跟进,您也可以这样做,在我看来这更容易理解:
SELECT * FROM (SELECT * FROM table1 ORDER BY start DESC) AS temp GROUP BY id;
或
SELECT * FROM (SELECT * FROM table1 ORDER BY start DESC) AS temp GROUP BY id ORDER BY id;
这会做同样的事情,所以这取决于你对查询的喜好,最后一个查询按ID对结果进行排序,而第一个则没有。