繁体   English   中英

SQL 返回每个 ID 的 4 个最新条目(非唯一)

[英]SQL Return the 4 most recent entries for each ID (non-unique)

每个 ID 至少有一组 4 个条目,每个通道 1-4 一个,并且可以用不同的日期重复。
所以 ID 001 可能有 8 个条目,2 个集合,而 ID 002 可能只有 4 个条目,1 个集合。
我想知道是否可以为每个 ID 返回最近的 4 个条目。

Here is my database setup
ID (not unique)
TestTime (datetime)
Channel (Values only 1,2,3 or 4)
Data

例子:

ID         TestTime        Channel Data
001   2022-09-14 16:42:00     1    2.5
001   2022-09-14 16:46:00     2    3.5
001   2022-09-14 16:50:00     3    1.5
001   2022-09-14 16:56:00     4    4.5

002   2022-09-13 16:42:00     1    0.5
002   2022-09-13 16:46:00     2    2.5
002   2022-09-13 16:50:00     3    1.5
002   2022-09-13 16:56:00     4    3.5

001   2022-09-12 16:42:00     1    1.5
001   2022-09-12 16:46:00     2    0.5
001   2022-09-12 16:50:00     3    1.5
001   2022-09-12 16:56:00     4    2.5

目标 Output:

ID         TestTime        Channel Data

002   2022-09-13 16:42:00     1    0.5
002   2022-09-13 16:46:00     2    2.5
002   2022-09-13 16:50:00     3    1.5
002   2022-09-13 16:56:00     4    3.5

001   2022-09-14 16:42:00     1    2.5
001   2022-09-14 16:46:00     2    3.5
001   2022-09-14 16:50:00     3    1.5
001   2022-09-14 16:56:00     4    4.5

可以按 TestTime 升序或降序排序。

您可以在数据集上使用子查询来隔离每个 ID 的四个最近日期:

DECLARE @Table TABLE (ID NVARCHAR(3), TestTime DATETIME, Channel TINYINT, Data DECIMAL(4,2))
INSERT INTO @Table (ID, TestTime, Channel, Data) VALUES 
('001', '2022-09-14 16:42:00', 1, 2.5),
('001', '2022-09-14 16:46:00', 2, 3.5),
('001', '2022-09-14 16:50:00', 3, 1.5),
('001', '2022-09-14 16:56:00', 4, 4.5),

('002', '2022-09-13 16:42:00', 1, 0.5),
('002', '2022-09-13 16:46:00', 2, 2.5),
('002', '2022-09-13 16:50:00', 3, 1.5),
('002', '2022-09-13 16:56:00', 4, 3.5),

('001', '2022-09-12 16:42:00', 1, 1.5),
('001', '2022-09-12 16:46:00', 2, 0.5),
('001', '2022-09-12 16:50:00', 3, 1.5),
('001', '2022-09-12 16:56:00', 4, 2.5)

SELECT t.*
  FROM @Table t
    INNER JOIN (SELECT ID, TestTime, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TestTime DESC) AS rn FROM @Table) a
      ON t.ID = a.ID
      AND t.TestTime = a.TestTime
      AND rn <= 4
ID  TestTime                Channel Data
----------------------------------------
001 2022-09-14 16:42:00.000 1       2.50
001 2022-09-14 16:46:00.000 2       3.50
001 2022-09-14 16:50:00.000 3       1.50
001 2022-09-14 16:56:00.000 4       4.50
002 2022-09-13 16:42:00.000 1       0.50
002 2022-09-13 16:46:00.000 2       2.50
002 2022-09-13 16:50:00.000 3       1.50
002 2022-09-13 16:56:00.000 4       3.50

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM