如何使用组选择前两行

Gop*_*pal 1 sql t-sql sql-server 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
.....
Run Code Online (Sandbox Code Playgroud)

我想从DESC 中ID排序的每组中选择前两行.dateTable1

查询看起来像这样:

SELECT TOP 2 DATE, ID, AMT FROM TABLE1 GROUP BY ID, AMT --(NOT WORKING)
Run Code Online (Sandbox Code Playgroud)

预期产量:

ID  date       amt
-------------------
001 21/01/2012 1200
001 25/02/2012 1400
002 21/03/2012 1200
002 01/01/2012 0500

.....
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 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
Run Code Online (Sandbox Code Playgroud)

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

好的,您可以使用DENSER_RANK()或者ROW_NUMBER()在我的回答中,我已经使用过,DENSE_RANK()因为我正在考虑重复.无论如何,它是OP的选择ROW_NUMBER()而不是使用DENSE_RANK().