Sql 为每个实体选择前N个记录
我有一张Sql 为每个实体选择前N个记录,sql,sql-server,sql-server-2008-r2,database-administration,Sql,Sql Server,Sql Server 2008 R2,Database Administration,我有一张表格,如下所示- 现在,我希望每个设备ID 预期产出 我使用的是SQLServer2008R2。我可以编写存储过程来处理它,但我想用简单的查询来处理它 ****************编辑************************** “Felix Pamittan”的答案很有效,但对于“N”,只需将其改为 SELECT Id, [Reported Date], Device_ID FROM ( SELECT *, Rn = ROW_NUMBER
表格
,如下所示-
现在,我希望每个
设备ID
预期产出
我使用的是
SQLServer2008R2
。我可以编写存储过程来处理它,但我想用简单的查询来处理它
****************编辑**************************
“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
他在评论中提到了这一点,想把它添加到问题中,这样就不会有人遗漏它。使用:
使用:
如果您不能使用分析函数,例如,因为您的应用程序层不允许使用该函数,那么您可以尝试以下解决方案,该解决方案使用子查询得出答案:
SELECT t1.ID, t2.maxDate, t1.Device_ID
INNER JOIN
(
SELECT Device_ID, MAX([Reported Date]) AS maxDate
FROM yourTable
GROUP BY Device_ID
) t2
ON t1.Device_ID = t2.Device_ID AND t1.[Reported Date] = t2.maxDate
如果您不能使用分析函数,例如,因为您的应用程序层不允许使用该函数,那么您可以尝试以下解决方案,该解决方案使用子查询得出答案:
SELECT t1.ID, t2.maxDate, t1.Device_ID
INNER JOIN
(
SELECT Device_ID, MAX([Reported Date]) AS maxDate
FROM yourTable
GROUP BY Device_ID
) t2
ON t1.Device_ID = t2.Device_ID AND t1.[Reported Date] = t2.maxDate
您也可以尝试使用CTE
With DeviceCTE AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [Reported Date] DESC) AS Num
FROM tblname)
SELECT Id, [Reported Date], Device_ID
From DeviceCTE
Where Num = 1
您也可以尝试使用CTE
With DeviceCTE AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Device_ID ORDER BY [Reported Date] DESC) AS Num
FROM tblname)
SELECT Id, [Reported Date], Device_ID
From DeviceCTE
Where Num = 1
如果要做到这一点,假设“基于日期列的前1行”意味着您要选择每个设备ID的最新报告日期
至于标题,请选择每个设备ID的前5行
Select * from DEVICE_TABLE D
where [Reported Date] in (Select top 5 [Reported Date] from DEVICE_TABLE D where Device_ID = D.Device_ID)
order by Device_ID, [Reported Date] desc
将为您提供每个设备id的前5个最新报告。
如果您的数据不符合顺序,您可能需要整理前5个日期
如果要做到这一点,假设“基于日期列的前1行”意味着您要选择每个设备ID的最新报告日期
至于标题,请选择每个设备ID的前5行
Select * from DEVICE_TABLE D
where [Reported Date] in (Select top 5 [Reported Date] from DEVICE_TABLE D where Device_ID = D.Device_ID)
order by Device_ID, [Reported Date] desc
将为您提供每个设备id的前5个最新报告。
如果您的数据不符合顺序,您可能希望对前5个日期进行排序…同样,如果没有分析功能,您可以使用交叉应用:
DECLARE @tbl TABLE(Id INT,[Reported Date] DateTime , Device_ID INT)
INSERT INTO @tbl
VALUES
(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)
SELECT r.*
FROM ( SELECT DISTINCT Device_ID FROM @tbl ) d
CROSS APPLY ( SELECT TOP 1 *
FROM @tbl t
WHERE d.Device_ID = t.Device_ID ) r
可以轻松修改以支持N条记录
学分转到wBob,再次回答此问题,没有分析函数,您可以使用交叉应用:
DECLARE @tbl TABLE(Id INT,[Reported Date] DateTime , Device_ID INT)
INSERT INTO @tbl
VALUES
(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)
SELECT r.*
FROM ( SELECT DISTINCT Device_ID FROM @tbl ) d
CROSS APPLY ( SELECT TOP 1 *
FROM @tbl t
WHERE d.Device_ID = t.Device_ID ) r
可以轻松修改以支持N条记录
回答此问题的wBob将获得积分您可以使用Group By
和MAX
获得所需积分您可以使用Group By
和MAX
获得所需积分。有什么特别的原因吗?@ CODROFCODE,因为OP需要<代码> ID <代码> @ AnshulNigam,你需要在子查询上加上别名,否则它会产生语法错误。“T”被认为是派生表。@ FelixPAMITTAN:所以如果我想得到前5,应该在最后替换RN=5?为什么不使用<代码>组> < /C> >和<代码> max 。有什么特别的原因吗?@ CODEOFCODE,因为OP需要<代码> ID <代码> @ AnshulNigam,你需要在子查询上设置别名,否则它会产生语法错误。T’被认为是派生表。@ FelixPAMITTAN:那么,如果我想获得前5,那么应该在最后替换RN=5?