Как выбрать конкретную предыдущую строку, которая удовлетворяет некоторому условию в SQL Server - PullRequest
1 голос
/ 11 апреля 2019

У меня есть таблица со столбцами PatientID, DiagnosisID и Date.Сценарий состоит в том, что если пациент приходил с одним и тем же диагнозом несколько раз в месяц, то только строки с разницей в датах, превышающей или равной 3, должны учитываться как число посещений для этого конкретного месяца.

Пример:

RowNumber PatientID DiagnosisID DiagnosisDate
1            P1         D1        29-12-2018
2            P1         D1        01-01-2019
3            P1         D1        05-01-2019
4            P1         D1        06-01-2019
5            P1         D1        08-01-2019
6            P1         D1        09-01-2019
7            P1         D1        13-01-2019
8            P1         D1        31-01-2019
9            P1         D1        01-02-2019
10           P1         D1        07-02-2019
  1. Количество посещений должно учитываться как 1 для декабря-2018

  2. DateDiff> = 3 между 1-й и 2-й строкой (29 декабря и1 января), следовательно, 1 января является действительным посещением.

  3. DateDiff> = 3 между 2-й и 3-й строкой (1 января и 5 января), следовательно, 5 января является действительным посещением.

  4. DateDiff <= 3 между 3-й и 4-й строкой (5 января и 6 января), следовательно, 6 января НЕ ДЕЙСТВИТЕЛЬНО. </p>

  5. DateDiff <= 3 между 4-ми 5-я строка (6 января и 8 января), следовательно, 8 января следует сравнить с предыдущим действительным визитом, то есть 5 января здесь datediff> = 3, поэтому 8 января - это новый действительный визит, а предыдущие строки следует сравнить с 8 января.

  6. DateDiff <= 3 между 5-й и 6-й строкой (8 января и 9 января) h9 января НЕ является ДЕЙСТВИТЕЛЬНЫМ ВИЗИТОМ. </p>

  7. DateDiff> = 3 между 6-й и 7-й строкой (13-го и 9-го января), следовательно, 13-е января является новым Действительным визитом.

  8. DateDiff> = 3 между 7-й и 8-й строкой (31 января и 13 января), следовательно, 31 января является новым действительным визитом.

  9. DateDiff <= 3 между 8-м и9-я строка (1 февраля и 31 января), следовательно, 1 февраля НЕ ДЕЙСТВИТЕЛЬНО. </p>

  10. DateDiff> = 3 между 9 и 10 строкой (7 февраля и 1 февраля), следовательно, 7 февралядействительное посещение.

Окончательный результат:

Dec-2018 visit count = 1 (29th Dec)
Jan-2019 visit count = 5 (1, 5, 8, 13 & 31st Jan)
Feb-2019 visit count = 1 ( 7th Feb )

В основном Datediff между текущей строкой и предыдущей строкой должен быть больше 3, если это условие ложнотекущая строка должна сравниваться с предыдущим действительным посещением.

Я пробовал реализовать его с помощью рекурсивного CTE, но я не могу найти условие завершения, т. е. сравнение должно прекратиться при предыдущем действительном посещении.

1 Ответ

0 голосов
/ 11 апреля 2019

используйте функцию LAG для проверки DATEDIFF

WITH test_tab as
(
select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
from table
)
Select * from test_tab ;

filterler> = 3

WITH test_tab as
    (
    select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
    DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
    from table
    )
    Select * from test_tab WHERE days>=3

и группируйте по году / месяцу

WITH test_tab as
        (
        select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
        DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
        from table
        )
Select YEAR(DiagnosisDate) year,Month(DiagnosisDate) montch,Count(RowNumber)
     from test_tab 
    WHERE days>=3
    GROUP BY YEAR(DiagnosisDate) ,Month(DiagnosisDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...