在SQL Server中对行进行分组

时间:2012-04-16 00:09:43

标签: sql sql-server-2008

我需要找到一种方法来分组在组中最新时间戳的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

1 个答案:

答案 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