如何使用组选择前两行

时间:2013-02-18 04:44:57

标签: sql sql-server tsql sql-server-2005 greatest-n-per-group

我有:

表1

ID  date       amt
-------------------    
001 21/01/2012 1200
001 25/02/2012 1400
001 24/03/2012 1500
001 21/04/2012 1000
002 21/03/2012 1200
002 01/01/2012 0500
002 08/09/2012 1000
.....

我想从ID的{​​{1}} DESC中选择每组date中的前两行。

查询如下所示:

Table1

预期产出:

SELECT TOP 2 DATE, ID, AMT FROM TABLE1 GROUP BY ID, AMT --(NOT WORKING)

1 个答案:

答案 0 :(得分:6)

您可以使用Common table ExpressionWindow Function

WITH recordList
AS
(
    SELECT  ID, DATE, Amt,
            DENSE_RANK() OVER (PARTITION BY ID ORDER BY DATE ASC) rn
    FROM    tableName
)
SELECT  ID, DATE, Amt
FROM    recordList
WHERE   rn <= 2

根据您上面所需的结果,您按ASCENDING订购日期。

好的,您可以使用DENSER_RANK()ROW_NUMBER(),但在我的回答中,我使用了DENSE_RANK(),因为我正在考虑重复项。无论如何,使用ROW_NUMBER()代替DENSE_RANK()是OP的选择。