mysql 5.7에서 lag 함수를 구현하고 싶습니다. 0 2 3,538

by 김정민 [SQL Query] mysql query [2021.04.16 01:23:13]


안녕하세요.

저는 앱 회사에서 데이터 분석을 맡고 있는 비개발자입니다....

분석용 데이터를 뽑다가 막히는 부분이 있어 가입을 하자마자 염치 없이 질문부터 하게 되었네요... ㅜ ㅜ

 

다름이 아니라, 저는 mysql 5.7에서 lag 함수를 구현하고 싶습니다. data set은 다음과 같이 준비되어 있습니다.

user_id

 

로그인 일자
1 2021.03.01
1 2021.03.02
2 2021.03.02
2 2021.03.04
1 2021.04.06
4 2021.01.01
4 2021.03.01
2 2021.01.19

저는 user_id와 로그인 일자를 기반으로, 해당 user_id가 로그인 일자 이전에 가장 최근 로그인한 일자가 언제인지 알고 싶습니다.

 

user_id 로그인 일자 기준 로그인 이전의 최근 로그인 일자
1 2021.03.01 null
1 2021.03.02 2021.03.01
2 2021.03.02 2021.01.19
2 2021.03.04 2021.03.02
4 2021.01.01 null
4 2021.03.01 2021.01.01

머리를 아무리 굴려도 해답이 나오지 않습니다.

도움을 주시면 감사드리겠습니다 ㅠㅠ

 

 

 

by 마농 [2021.04.16 08:21:12]
-- 1. Self Join --
SELECT a.user_id
     , a.login_dt
     , MAX(b.login_dt) leg_dt
  FROM t a
  LEFT OUTER JOIN t b
    ON a.user_id  = b.user_id
   AND a.login_dt > b.login_dt
 GROUP BY a.user_id, a.login_dt
;
-- 2. @변수 사용 --
SELECT user_id
     , login_dt
     , lag_dt
  FROM (SELECT user_id
             , login_dt
             , CASE WHEN @id = user_id THEN @dt END lag_dt
--             , IF(@id = user_id, @dt, null) lag_dt
             , @dt := login_dt
             , @id := user_id
          FROM t
         ORDER BY user_id, login_dt
        ) a
;
-- 3. 스칼라서브쿼리 --
SELECT user_id
     , login_dt
     , (SELECT login_dt
          FROM t b
         WHERE b.user_id  = a.user_id
           AND b.login_dt < a.login_dt
         ORDER BY login_dt DESC
         LIMIT 1
        ) lag_dt
  FROM t a
 ORDER BY user_id, login_dt
;

 


by 김정민 [2021.04.27 00:05:30]

감사 인사가 늦었습니다 !

쿼리 돌려볼 시간이 없어서... 꼭 도전해보고 다시 말씀드릴게요.

말씀 감사합니다!

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