В моей таблице есть некоторые данные (tb1
):
PK datetime1 datetime2 grp
--------------------------------------------------------
1 2016-01-01 00:30:10 2016-01-01 00:33:10 1
2 2013-01-01 00:30:10 2013-01-01 00:34:10 2
Я пытаюсь найти количество событий на основе даты и времени1, даты и времени2 и местоположения.
Так вот мой запрос:
select count(*), datetime1, datetime2, grp
from tb1
group by datetime1, datetime2, grp
Здесь проблем нет.
В некоторой степени я хотел бы найти количество на основе:
когда разница между датой и временем1 между двумя последовательными строками (может быть достигнута опережающей функцией) меньше 1 секунды, а разница между датой и временем2 между двумя последовательными строками составляет менее 1 секунды, и grp.
Я могу использовать руководство для нахождения разницы между двумя последовательными строками, но не знаю, как здесь применить функцию подсчета для группировки по сходству во времени между двумя последовательными строками.
Чтобы сделать это проще, я ищу что-то вроде этого:
если
select
count(*), grp, ....
from
tb1
where
datediff(s, lead(datetime1, 1, 1) over (partition by grp order by datetime1)) = 1
and datediff(s, lead(datetime2, 1, 1) = 1 over (partition by grp order by datetime2) = 1
group by
lead(datetime1, 1, 1) over (partition by grp order by datetime1),
lead(datetime2, 1, 1) over (partition by grp order by datetime2),
grp
Пожалуйста, дайте мне знать, если есть необходимость в дополнительных разъяснениях.
ЕСТЬ ли и отсутствует "когда разница между датой и временем 1 между двумя последовательными строками составляет менее 1 секунды И разница между датой и временем 2 между двумя последовательными строками составляет менее 1 секунды"
исправлено, спасибо, а также неправильный порядок расположения и группировки :)
Примечание: вы продолжаете писать фразу «две последовательные строки», но в реляционной базе данных строки таблицы по своей природе не отсортированы, поэтому нет такой вещи, как «последовательные строки».
Я знаю об этом. Я достигаю этого, используя ведущую функцию, чтобы найти следующую строку, добавил это к вопросу, спасибо
Представьте, что строка 2 может быть сгруппирована с строкой 1 или строкой 3. Как избежать двойного счета?
@P.Salmon см. sqlfiddle.com/#!18/b4a43/1/0
@П.Сэлмон. Ты был на 100 прав. Мой подход был неправильным, и ваш комментарий имеет больше смысла, когда я углубляюсь в проблему. Эта ситуация не так проста, как я думал. Это требует больших усилий или изменения подхода, такого как кластеризация.