Группировка по идентификатору и временному интервалу в мс. - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь написать запрос, который группирует подобные идентификаторы в пределах промежутка времени.

Сценарий реального мира: я хочу видеть строки, созданные с одним и тем же идентификатором, в течение 5 секунд друг от друга.

SELECT top 10 
Id, 
CreatedOn
FROM Logs
where ((DATEPART(SECOND, CreatedOn) + 5) - DATEPART(SECOND, CreatedOn)) < 10
GROUP BY 
DATEPART(SECOND, CreatedOn),
Id,
CreatedOn
order by CreatedOn desc

Это не совсем правильно, но я чувствую, что на правильном пути.

заранее спасибо

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вы можете попытаться выполнить запрос при условии, что ID совпадает, а секунды с начала эпохи находятся в пределах 5 секунд от совпадающей записи:

SELECT
    t1.Id,
    t1.CreatedOn
FROM logs t1
WHERE EXISTS (SELECT 1 FROM logs t2
              WHERE t1.Id = t2.Id AND
                    t1.CreatedOn <> t2.CreatedOn AND
                    ABS(DATEDIFF(SECOND, t1.CreatedOn, t2.CreatedOn)) <= 5)
ORDER BY
    t1.CreatedOn DESC;
0 голосов
/ 16 июня 2019

Может быть дополнительно оптимизировано следующим образом:

SELECT t1.Id,
       ,t1.CreatedOn
FROM   logs t1
WHERE  EXISTS (
               SELECT 1 
               FROM   logs t2
               WHERE  t2.Id = t1.Id
               AND    t2.CreatedOn <> t1.CreatedOn 
               AND    ABS(DATEDIFF(SECOND, t1.CreatedOn, t2.CreatedOn)) <= 5
              )
ORDER  BY
       t1.CreatedOn DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...