Возвращение данных, если даты не менее 7 дней - PullRequest
0 голосов
/ 18 октября 2018

Я заинтересован в том, чтобы в запросе Microsoft SQL Server оставались только отдельные лица, значения которых превышают определенный порог в две отдельные даты.Если у людей в два раза выше 150 баллов, а второе свидание наступает как минимум через 7 дней после первого свидания, я хотел бы вернуть их удостоверение личности, вторую дату, когда их балл был выше 150, и балл на втором свидании.

Вот данные:

SubjectID   DATE         Score
001         01/11/2014   147
001         02/11/2013   151
002         02/10/2015   152
003         08/12/2013   155
002         01/31/2012   159
003         07/19/2016   157

Так что я за результаты, я хотел бы вернуть следующее:

SubjectID   DATE         Score
002         02/10/2015   152
003         07/19/2016   157

Согласно предыдущему вопросу, который я задалЯ использую следующий код для возврата второй даты:

 SELECT *
    FROM Clinic a
    WHERE a.score > 150 
          AND a.date IN (SELECT MAX(b.date) 
                         FROM Clinic b 
                         WHERE b.subjectId = a.subjectId 
                                AND b.score > 150)

Я думаю, мне нужно добавить что-то вроде следующего в оператор WHERE:

AND (b.date - a.date) > 7;

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

LAG это путь.Но на тот случай, если вы хотите выполнить свой оригинальный запрос:

SELECT *
FROM Clinic AS curr
WHERE Score > 150 
AND Date >= (
    SELECT DATEADD(DAY, 7, MAX(Date)) -- maximum date + 7 days
    FROM Clinic AS prev
    WHERE SubjectID = curr.SubjectID
    AND Date < curr.Date -- prev dates
    AND Score > 150
)

DB Fiddle

0 голосов
/ 18 октября 2018

Просто используйте lag():

select c.*
from (select c.*, lag(date) over (partition by c.subjectid order by c.date) as prev_date
      from clinic c
      where c.score > 150
     ) c
where date > dateadd(day, 7, prev_date);

Вы также можете обратиться к этому с помощью коррелированного подзапроса:

select c.*
from clinic c
where c.score > 150 and
      c.date > (select dateadd(day, 7, c2.date)
                from clinic c2
                where c2.subjectid = c.subjectid and c2.score > 150
               );
...