MSSQL 쿼리 질문드립니다. 0 4 808

by 힘내라김대리 [SQLServer] mssql query sql server [2021.11.17 14:04:42]


안녕하세요. 쿼리로 어떤 상태값을 만드려고 하는데, 풀릴듯 안풀리고 있는 문제가 있어서 질문드립니다.

 

한 사람이 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' 로 변경이 되야하는 문제입니다.

 

어떻게 쿼리를 작성하면 될까요?

by pajama [2021.11.17 14:30:46]

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

 


by 힘내라김대리 [2021.11.17 15:45:07]

와우...LAG 라는 함수가 있었군요.. .처음 접하는 함순데...역시 사람은 똑똑해야하나 봅니다. 감사합니다!!


by 우주민 [2021.11.17 14:44:25]

위의 답변에 PARTITION BY cust_key 처리를 해주면 될거 같습니다.

예시에는 cust_key 값이 단일값이라 저 쿼리가 정상적으로 동작하겠지만 해당 값이 여러개가 될때는 각각의 cust_key값에 로직이 적용되어야 할듯 하네요


by 힘내라김대리 [2021.11.17 15:46:07]

추가로 답변 주셔서 감사합니다. 우주민님 추가 조언으로 빠르게 작업하고, 빠르게 퇴근할 수 있을 것 같네요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입