SQL - Сравнение строк в таблице с функцией отставания на основе значений столбцов - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь создать столбец с именем previous_month, который на основе групп различного типа / идентификатора выглядит для предыдущей строки, если month_in на месяц меньше текущей строки, и если да, то previous_month = Верно, иначе False.

type    id  month_in    previous_month
a       1   2019-09-01  FALSE
a       1   2019-10-01  TRUE
a       1   2019-11-01  TRUE
a       1   2020-02-01  FALSE
a       2   2020-01-01  FALSE
a       2   2020-02-01  TRUE

Я пытался использовать функцию задержки

Select 
       type, 
       id,
       month_for,
       lag(True, 1, False) over (partition by type, id order by type, id, month_for) as previous_month

from myTable

, однако это не учитывает, когда month_in увеличивается более чем на один месяц, т.е. Я получаю эту таблицу:

type    id  month_in    previous_month
a       1   2019-09-01  FALSE
a       1   2019-10-01  TRUE
a       1   2019-11-01  TRUE
a       1   2020-02-01  TRUE
a       2   2020-01-01  FALSE
a       2   2020-02-01  TRUE

Есть предложения, если это возможно с функцией задержки? или если не самый эффективный способ добиться этого? Я работаю в снежинке sql.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Да, это возможно, и вам просто нужно внести небольшие изменения в ваш запрос, чтобы сравнить разницу в месяцах. Я предполагаю, что SQL сервер. Вам просто нужно убедиться, что разница является предыдущей, а текущая строка находится в пределах 1 месяца

Select 
       type, 
       id,
       month_for,
       case when datediff(month,  lag(month_for, 1) over (partition by type, id order by type, id, month_for), month_for) = 1 then 'TRUE' ELSE 'FALSE' as previous_month

from myTable
0 голосов
/ 12 февраля 2020

Вы можете использовать самостоятельное соединение и "не существует"

Select 
       a.type, 
       a.id,
       a.month_in,  
       case 
        when datediff(month, a.month_in, b.month_in)= -1 Then 'TRUE'
        else 'False' end as previous_month  

from myTable a left join myTable b on a.type = b.type and a.id = b.id and a.month_in > b.month_in
and not exists
(
  select 1 from myTable c where a.type = c.type and a.id = c.id
  and c.month_in > b.month_in and c.month_in < a.month_in 
)

Вывод:

type    id  month_in    previous_month
a   1   2019-09-01  False
a   1   2019-10-01  TRUE
a   1   2019-11-01  TRUE
a   1   2020-02-01  False
a   2   2020-01-01  False
a   2   2020-02-01  TRUE
...