2012-04-16 59 views
0

我需要找到分组是相同的5分钟组在最新的时间戳和displayid和对象ID内发生的行的方式.....分组排在SQL Server

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的时间戳是5分钟之内的基团最新时间戳(行7)。

列9本身,因为有数据集中没有行分组,其中5分钟的那个组的最新时间戳内displayid而objectid比赛

*我使用SQL Server 2008 R2的

+0

仅供参考,您正在使用SQL Server 2008 R2,而不是“MS SQL” – 2012-04-16 00:12:08

+1

如果试图组记录不多相隔五分钟(即组由g决定) APS在它的低端和高端,差距超过五分钟),请看看[如何选择记录在SQL Server中相隔一小时](http://stackoverflow.com/questions/10037126/how以诚取记录一小时的开 - 从一-另一个功能于SQL服务器/ 10037501#10037501) – 2012-04-16 01:06:33

+1

这是很容易理解,如果你告诉我们,你所期望的输出。 – Arion 2012-04-16 07:01:00

回答

0

谢谢采取一看,您的建议,这soloution一直运作良好,我...

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