Я пытаюсь создать столбец с именем previous_month, который на основе групп различного типа / идентификатора выглядит для предыдущей строки, если month_in на месяц меньше текущей строки и если да, то {{X2 }} = True, а иначе 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.

1
cmf05 12 Фев 2020 в 06:26

2 ответа

Лучший ответ

Да, это возможно, и вам просто нужно внести небольшие изменения в ваш запрос, чтобы сравнить разницу в месяцах. Я предполагаю в качестве сервера 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
1
Avi 12 Фев 2020 в 03:38

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

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
0
zip 12 Фев 2020 в 03:44