안녕하세요. 쿼리로 어떤 상태값을 만드려고 하는데, 풀릴듯 안풀리고 있는 문제가 있어서 질문드립니다.
한 사람이 2010년도부터 2021년도까지 어떤 곳을 여러번 방문을 했습니다.
처음 방문하면, 'new' 라는 flag를 넣고, 두번째 이상부터는 'old' 라는 flag를 넣으려고 합니다.
하지만 여기서 추가되는 조건이, 5년(60개월)이내에 재방문을 하면 'old' , 5년이 지난후 재방문을 하면 'new' 라는 flag로 변경을 해야합니다.
예)
seq | visit_date | cust_key |
1 | 2010-08-07 | C00000001 |
2 | 2010-09-13 | C00000001 |
3 | 2016-02-13 | C00000001 |
4 | 2020-11-15 | C00000001 |
5 | 2020-11-15 | C00000001 |
6 | 2021-10-04 | C00000001 |
예상 결과값)
seq | visit_date | cust_key | fla |
1 | 2010-08-07 | C00000001 | new |
2 | 2010-09-13 | C00000001 | old |
3 | 2016-02-13 | C00000001 | new |
4 | 2020-11-15 | C00000001 | old |
5 | 2020-11-15 | C00000001 | old |
6 | 2021-10-04 | C00000001 | old |
예상 결과값을 살펴보면 seq 2번에 방문일자가 2010년 9월 이였고, seq3번에 방문일자가 2016년 02월 이였습니다.
이 둘의 차이는 60개월 이상 차이가 나서, 'old' -> 'new' 로 변경이 되야하는 문제입니다.
어떻게 쿼리를 작성하면 될까요?
lag 함수로 해봤습니다.
with t (seq, visit_date, cust_key ) as ( select 1, '2010-08-07', 'C00000001' union all select 1, '2010-09-13', 'C00000001' union all select 1, '2016-02-13', 'C00000001' union all select 1, '2020-11-15', 'C00000001' union all select 1, '2020-11-15', 'C00000001' union all select 1, '2021-10-04', 'C00000001' ) select seq, visit_date, cust_key, case when datediff(yy,visit_prev,visit_date) >= 5 then 'new' else 'old' end diff from ( select *, lag(visit_date, 1, '1900-01-01') over (order by visit_date) visit_prev from t ) tmp