Найти ближайшую разницу во времени между логинами - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть база данных идентификаторов и дат. вот так:

ID       Date
1        2019-12-1
1        2019-10-1
1        2019-09-1
2        2019-12-1
2        2019-10-1
3        2019-12-1

Я хочу написать запрос, который будет возвращать минимальную разницу между двумя датами для одного и того же идентификатора, вот так (скажем, в месяцах):

ID       Difference
1            1
2            2

3 не должен появляться в результатах вообще, поскольку он не имеет повторяющихся записей или отображается как 3-NULL

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Попробуй это. Я проверил это в oracle.

select A.id,min(MONTHS_BETWEEN(A.date1,B.date1)) from test A join test B on
A.id=B.id and A.date1>B.date1
group by A.id
order by A.id;

Вы также можете использовать DATEDIFF, чтобы извлечь разницу в месяцах, если вы используете MySQL или SQL Сервер.

0 голосов
/ 07 февраля 2020

Вы можете использовать оконные функции и агрегирование:

select id, min(datediff(date, lag_date)) diff
from (select id, date, lag(date) over(partition by id oder by date) lag_date from mytable) t
group by id

Внутренний запрос извлекает предыдущий date для того же id. Внешний запрос агрегирует по id и вычисляет минимальную разницу дат.

Обратите внимание, что функции даты сильно зависят от базы данных, поэтому синтаксис для вычисления разницы между датами варьируется в зависимости от базы данных - в приведенном выше решении используется MySQL синтаксис, другие базы данных имеют альтернативный синтаксис, реализующий те же функции.

...