разрыв между посещениями более 3 месяцев- sql

#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, посещение); больший оператор, но выдал мне ошибку — Гордон Линофф