2012-04-16 7 views
0

мне нужно найти способ группировки строк, которые происходят в течение 5 минут после последней временной метки в группе и DisplayID и идентификатор объекта, такие же .....Группировка строк в 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 встречается в течение 5 минут от строки 1, в наборе данных нет других строк, содержащих одни и те же displayid и objectid, и временную метку в течение 5 минут из последней временной отметки группы (строка 2), поэтому ..

Строка 3 сгруппирована сама по себе, поскольку в наборе данных нет строк, где displayid и objectid соответствуют в течение 5 минут этой группы последней временной метки (строка 3).

Строки 4, 5 и 6 сгруппированы, потому что совпадение displayid, совпадение объекта и временные метки строк находятся в пределах 5 минут от последней строки, временная метка строки 5 находится в пределах 5 минут от строки 4, а временная метка строки 6 5 минут 5-го ряда.

Строки 7 и 8 сгруппированы, потому что объектные и дисплейные объекты одинаковы, а временная метка строки 8 находится в пределах 5 минут после того, как эта группа будет последней временной отметкой (строка 7).

Строка 9 группируется по себе, потому что нет строк в наборе данных, где DisplayID и ObjectID матч в 5-й минуте, что группы последней временной метки

* Я использую SQL Server 2008 R2

+0

FYI, вы используете SQL Server 2008 R2, а не «MS SQL» –

+1

Если попытаться сгруппировать записи не более чем на пять минут (т. е. группа определяется g aps на его нижнем и верхнем концах, пробелы длиннее пяти минут), пожалуйста, взгляните на [как выбрать записи за один час друг от друга на сервере sql] (http://stackoverflow.com/questions/10037126/how -to-pick-records-a-hour-apart-from-one-another-in-sql-server/10037501 # 10037501) –

+1

Это намного проще понять, если вы покажете нам, какой результат вы ожидаете. – Arion

ответ

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 
Смежные вопросы