Сравните строку с предыдущими 12 значениями - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь сравнить значение с предыдущими 12 месяцами / 12 строками. Если значение «да» в последние 12 месяцев, то да для 12-го ряда. Аналогично для каждой строки (сравните предыдущие 12 значений).

Я делаю это следующим образом. Это работает, но я должен сделать это для нескольких столбцов, поэтому код будет очень длинным.

Есть ли способ сделать это простым шагом для n столбцов?

select *,
--Identify customers who have applied for principal relief within the past 12 months
 lag(PrincipalReliefFlag,1)  over(partition by id,productcode order by snapshot_date) PRflg1
,lag(PrincipalReliefFlag,2)  over(partition by id,productcode order by snapshot_date) PRflg2
,lag(PrincipalReliefFlag,3)  over(partition by id,productcode order by snapshot_date) PRflg3
,lag(PrincipalReliefFlag,4)  over(partition by id,productcode order by snapshot_date) PRflg4
,lag(PrincipalReliefFlag,5)  over(partition by id,productcode order by snapshot_date) PRflg5
,lag(PrincipalReliefFlag,6)  over(partition by id,productcode order by snapshot_date) PRflg6
,lag(PrincipalReliefFlag,7)  over(partition by id,productcode order by snapshot_date) PRflg7
,lag(PrincipalReliefFlag,8)  over(partition by id,productcode order by snapshot_date) PRflg8
,lag(PrincipalReliefFlag,9)  over(partition by id,productcode order by snapshot_date) PRflg9
,lag(PrincipalReliefFlag,10) over(partition by id,productcode order by snapshot_date) PRflg10
,lag(PrincipalReliefFlag,11) over(partition by id,productcode order by snapshot_date) PRflg11
into #test
from #temp

select *
,case when (PrincipalReliefFlag='Y' or PRflg1='Y' or PRflg2='Y' or PRflg3='Y' or PRflg4='Y' or PRflg5='Y' or PRflg6='Y' or PRflg7='Y' or PRflg8='Y' or PRflg9='Y' or PRflg10='Y' or  PRflg11='Y')
    then  'Y' 
    when (PrincipalReliefFlag='N' 
                                and (PRflg1='N' or PRflg1 is null)  
                                and (PRflg2='N' or PRflg2 is null) 
                                and (PRflg3='N' or PRflg3 is null) 
                                and (PRflg4='N'  or PRflg4 is null)
                                and (PRflg5='N' or PRflg5 is null)
                                and (PRflg6='N' or  PRflg6 is null)
                                and (PRflg7='N' or PRflg7 is null)
                                and (PRflg8='N' or  PRflg8  is null)
                                and (PRflg9='N' or PRflg9 is null)
                                and (PRflg10='N' or PRflg10 is null)
                                and (PRflg11='N' or PRflg11 is null) )
    then 'N'
    end PrincipalRelief_applied_in_last12m
from #test

Ожидается простой шаг. попытался использовать соединения, но не смог.

1 Ответ

2 голосов
/ 17 октября 2019

Это то, что вы хотите?

select t.*,
       max(PrincipalReliefFlag) over (partition by id, productcode
                                      order by snapshot_date
                                      rows between 11 preceding and current row
                                     ) as PrincipalReliefFlag_12
from #temp t;

Это принимает максимальное значение за 12-месячный период - и будет работать, если флаг принимает только значения 'Y' и 'N'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...