#sql
#sql
Вопрос:
я пытаюсь определить идентификаторы, у которых разрыв между посещениями более 3 месяцев
CREATE TABLE Data (
ID int,
visit datetime);
INSERT INTO data (ID,visit)
VALUES
(1,'1998-05-18 00:00:00.000'),
(1,'1995-05-18 00:20:00.000'),
(1,'1994-12-18 01:00:00.000'),
(1,'1994-007-18 00:00:00.000'),
(2,'2000-06-29 13:30:00.000'),
(2,'2000-05-29 13:45:00.000'),
(2,'2000-04-29 10:30:00.000'),
(3,'2009-09-29 13:30:00.000'),
(3,'2009-01-29 13:30:00.000'),
(3,'2008-12-29 13:30:00.000');
Комментарии:
1. Определите «разрыв» здесь. Означает ли это, что у него нет ближайшего посещения ни до, ни после, в течение 3 месяцев? Кроме того, включите выходные данные и сообщите нам, какую версию SQL вы используете.
2. Также укажите ожидаемый результат — в виде форматированного текста (без изображений.).
3. Пометьте свой вопрос базой данных, которую вы используете.
Ответ №1:
Вы можете использовать lag()
. date
/ time
функции значительно различаются между базами данных, но идея в том,:
select distinct id
from (select d.*, lag(visit) over (partition by id order by visit) as prev_visit
from data d
) d
where prev_visit < visit - interval '3 month';
Вот скрипка db<> . При этом используется SQL Server, поэтому where
предложение:
where prev_visit < dateadd(month, -3, visit);
Комментарии:
1. Спасибо, если в случае, если я хочу узнать больше 3 месяцев или меньше трех месяцев? Есть ли какой-нибудь способ сделать это @Gordon Linoff
2. @priya . . . Вы бы скорректировали логику сравнения дат в
where
.3. Я пытался использовать, где prev_visit < dateadd(месяц, -> 3, посещение);
4. пробовал, где prev_visit < dateadd(месяц, ->3, посещение); больший оператор, но выдал мне ошибку
5. Я пробовал, где prev_visit < dateadd(месяц, ->3, посещение); больший оператор, но выдал мне ошибку — Гордон Линофф