Как создать флаг на основе значений даты в кусте - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть пример таблицы следующим образом:

|  name | startdate | enddate    | flg |
|-------|-----------|------------|-----|
| John  | 6/1/2018  | 7/1/2018   |     |
| John  | 10/1/2018 | 11/1/2018  |     |
| John  | 12/1/2018 | 12/20/2018 |     |
| Ron   | 3/1/2017  | 9/1/2017   |     |
| Ron   | 5/1/2018  | 10/1/2018  |     |
| Jacob | 6/10/2018 | 6/12/2018  |     |

Что я хочу получить в выводе: если у человека есть «начальная дата» в течение 60 дней (или 2 месяцев) от значений «конечной даты»;затем установите флаг 1 для этого человека.в противном случае флаги равны 0. Например: у Джона есть запись начальной даты 1 декабря;который находится в течение 60 дней с даты окончания этого человека (1 ноября 2018 года).Итак, flg для этого человека установлен в 1.

Итак, вывод должен выглядеть так:

| Name  | startdate | enddate    | flg |
|-------|-----------|------------|-----|
| John  | 6/1/2018  | 7/1/2018   | 1   |
| John  | 10/1/2018 | 11/1/2018  | 1   |
| John  | 12/1/2018 | 12/20/2018 | 1   |
| Ron   | 3/1/2017  | 9/1/2017   | 0   |
| Ron   | 5/1/2018  | 10/1/2018  | 0   |
| Jacob | 6/10/2018 | 6/12/2018  | 0   |

Любая идея, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Используйте lag, чтобы получить конечную дату предыдущей строки (по имени).После этого flag можно установить для имени с помощью оконной функции max с выражением case, которое проверяет, удовлетворяется ли разность в 60 дней хотя бы один раз для имени.

select name
      ,startdate
      ,enddate
      ,max(case when datediff(startdate,prev_end_dt) < 60 then 1 else 0 end) over(partition by name) as flag
from (select t.*
            ,lag(enddate) over(partition by name order by startdate) as prev_end_dt
      from table t
     ) t
0 голосов
/ 06 декабря 2018

Функции даты : используйте datediff и case

select Name,startdate,enddate,
       case when datediff(enddate,startdate) < 60 then 1 else 0 end flag
from table

Если вы сравниваете конечную дату предыдущей строки, используйте lag()

select Name,startdate,enddate,
    case when datediff(startdate,prev_enddate) < 60 then 1 else 0 end flag
from 
(
    select Name,startdate,enddate,
       lag(endate) over(partition by Name order by startdate,enddate) as prev_enddate
    from table
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...