我需要找到一种方法来分组在组中最新时间戳的5分钟内出现的行,并且displayid和object id是相同的.....
CREATE TABLE [dbo].[ExampleLog](
[ID] [uniqueidentifier] NOT NULL,
[EVENTNUMBER] [int] NULL,
[DISPLAYSERIAL] [int] NULL,
[DISPLAYID] [varchar](50) NULL,
[OBJECTSERIAL] [int] NULL,
[OBJECTRSSILEVEL] [int] NULL,
[OBJECTID] [varchar](50) NULL,
[TIMESTAMP] [datetime] NULL)
INSERT INTO [dbo].[ExampleLog]
VALUES
(NewID(), 206, 6897913, 'HV 644', 6885819, 66, 'WAP 8', '2012-01-01 12:12:00'),
(NewID(), 206, 6897913, 'HV 644', 6885819, 66, 'WAP 8', '2012-01-01 12:13:00'),
(NewID(), 206, 6897913, 'HV 644', 6877807, 54, 'MV 20', '2012-01-01 12:16:00'),
(NewID(), 103, 6897913, 'HV 644', 6898052, 118, 'HV 62', '2012-01-01 12:20:00'),
(NewID(), 206, 6897913, 'HV 644', 6886130, 122, 'HV 62', '2012-01-01 12:21:00'),
(NewID(), 206, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:25:00'),
(NewID(), 204, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:31:00'),
(NewID(), 204, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:33:00'),
(NewID(), 104, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:39:00')
所以使用上面的数据集,理想情况下我的结果将分组如下;
第1行和第2行被分组,因为objectid和displayid是相同的,第2行发生在第1行的5分钟内,数据集中没有其他行包含相同的displayid和objectid以及5分钟内的时间戳。该组的最新时间戳(第2行)所以......
第3行按其自身分组,因为数据集中没有行,其中displayid和objectid在该组最新时间戳(第3行)的5分钟内匹配。
第4,5和6行被分组,因为displayid的匹配,objectid的匹配和行时间戳在最后一行的5分钟内,第5行的时间戳在第4行的5分钟内,第6行的时间戳在5以内第5行的分钟。
第7行和第8行被分组,因为objectid和displayid是相同的,而第8行的时间戳是在最新时间戳组(第7行)的5分钟内。
第9行按其自身分组,因为数据集中没有行,其中displayid和objectid在该组最近时间戳的5分钟内匹配
*我正在使用SQL Server 2008 R2
答案 0 :(得分:0)
感谢您看一下,以及您的建议,这个解决方案对我来说效果很好......
WITH
cte_remove AS (
SELECT b.*
FROM dbo.examplelog a
INNER JOIN dbo.examplelog b ON
a.ID != b.ID AND
a.DISPLAYID = b.DISPLAYID AND
a.OBJECTID = b.OBJECTID AND
b.[timestamp] BETWEEN a.[timestamp] AND DATEADD(SECOND, 300, a.[timestamp])
),
cte_results AS (
SELECT * FROM dbo.examplelog EXCEPT
SELECT * FROM cte_remove
)
SELECT * FROM cte_results ORDER BY [timestamp]
GO