Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个实体选择前N个记录_Sql_Sql Server_Sql Server 2008 R2_Database Administration - Fatal编程技术网

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?