Получить n-й результат в разделе, если n-1, n-2 .. результаты в течение 30 дней после n - PullRequest
0 голосов
/ 29 июня 2019
+----------+-----------+-----------+-----------+----------+
| ClientID | EpisodeID | StartDT   | EndDT     | Location |
+----------+-----------+-----------+-----------+----------+
| 1        | 1         | 3/1/2019  | 3/14/2019 | A        |
+----------+-----------+-----------+-----------+----------+
| 1        | 2         | 6/5/2019  | 6/18/2019 | B        |
+----------+-----------+-----------+-----------+----------+
| 1        | 3         | 6/21/2019 | 6/25/2019 | C        |
+----------+-----------+-----------+-----------+----------+
| 2        | 5         | 4/13/2019 | 4/19/2019 | A        |
+----------+-----------+-----------+-----------+----------+
| 2        | 6         | 4/25/2019 | 5/2/2019  | A        |
+----------+-----------+-----------+-----------+----------+
| 3        | 10        | 8/1/2019  | 8/18/2019 | E        |
+----------+-----------+-----------+-----------+----------+
| 3        | 11        | 10/1/2019 | 10/9/2019 | F        |
+----------+-----------+-----------+-----------+----------+

Поиск выходных данных только для последней строки эпизода для каждого клиента, если имеется несколько эпизодов или реадмиссия в 30-дневном окне (30 дней между датой окончания предыдущего эпизода и датой начала следующего эпизода), в то время как также сохраняет эпизоды этого клиента, если не было последующего эпизода через 30 дней после EndDT.

Желаемый выход:

+----------+-----------+-----------+-----------+----------+
| ClientID | EpisodeID | StartDT   | EndDT     | Location |
+----------+-----------+-----------+-----------+----------+
| 1        | 1         | 3/1/2019  | 3/14/2019 | A        |
+----------+-----------+-----------+-----------+----------+
| 1        | 3         | 6/21/2019 | 6/25/2019 | C        |
+----------+-----------+-----------+-----------+----------+
| 2        | 6         | 4/25/2019 | 5/2/2019  | A        |
+----------+-----------+-----------+-----------+----------+
| 3        | 10        | 8/1/2019  | 8/18/2019 | E        |
+----------+-----------+-----------+-----------+----------+
| 3        | 11        | 10/1/2019 | 10/9/2019 | F        |
+----------+-----------+-----------+-----------+----------+

Попытка упрощенного кода:

WITH CTE AS
(
SELECT
    ClientID
    ,EpisodeID
    ,StartDT
    ,EndDT
    ,Location

FROM DeNormalized DN)

SELECT 
    CTE.*

FROM CTE
INNER JOIN CTE CTE2
    ON CTE.ClientID=CTE2.ClientID
WHERE 1=1
    AND DATEDIFF(day,CTE2.EndDT,CTE.StartDT) <= 30

У меня также нет разрешений DDL, кроме временных объектов, поскольку это размещенная база данных T-SQL

1 Ответ

1 голос
/ 29 июня 2019

Я думаю, вы можете использовать lead():

select dn.*
from (select dn.*, lead(startdt) over (partition by clientId order by startdt) as next_startdt
      from denormalized dn
     ) dn
where next_startdt is null or
      next_startdt > dateadd(day, 30, enddt)
...