3

我有一张这样的桌子:

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 获取一行最新信息。

我该如何编写查询?

4

2 回答 2

4

SQL Server支持Common Table ExpressionWindowing FunctionsROW_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
于 2013-04-08T17:03:21.017 回答
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 对结果进行排序,而第一个则没有。

http://sqlfiddle.com/#!2/885cd/1

于 2013-04-08T17:56:45.927 回答