为每个实体选择前N个记录

Ans*_*gam 0 sql sql-server database-administration sql-server-2008-r2

我有一个table像下面 -


ID   |  Reported Date                  | Device_ID
-------------------------------------------
1    | 2016-03-09 09:08:32.827         | 1
2    | 2016-03-08 09:08:32.827         | 1
3    | 2016-03-08 09:08:32.827         | 1
4    | 2016-03-10 09:08:32.827         | 2
5    | 2016-03-05 09:08:32.827         | 2
Run Code Online (Sandbox Code Playgroud)

现在,我想要一个top 1 row基于date column每个device_ID

预期产出


ID   |  Reported Date                  | Device_ID
-------------------------------------------
1    | 2016-03-09 09:08:32.827         | 1
4    | 2016-03-10 09:08:32.827         | 2
Run Code Online (Sandbox Code Playgroud)

我在用SQL Server 2008 R2.我可以去编写Stored Procedure处理它,但想用简单的查询来做.

****************编辑**************************

回答'Felix Pamittan'运作良好,但'N'只是改为

SELECT
    Id, [Reported Date], Device_ID
FROM (
    SELECT *,
        Rn = ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [ReportedDate] DESC)
    FROM tbl
)t
WHERE Rn >= N
Run Code Online (Sandbox Code Playgroud)

他在评论中提到了这一点,并将其添加到问题中,以便没有人遗漏它.

Fel*_*tan 6

用途ROW_NUMBER:

SELECT
    Id, [Reported Date], Device_ID
FROM (
    SELECT *,
        Rn = ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [ReportedDate] DESC)
    FROM tbl
)t
WHERE Rn = 1
Run Code Online (Sandbox Code Playgroud)