본문 바로가기

TIL 통합/SQL

[LEETCODE] [MySQL] Use window function for big data - LEAD(), LAG() 함수

[MySQL] Use window function for big data

https://leetcode.com/problems/human-traffic-of-stadium/solutions/911779/mysql-use-window-function-for-big-data/

 

 

[풀이1]

-생각한 조건들:

1)추가 칼럼 1: 해당 행의 PEOPLE이 100이 넘고, 이후 3번째 열까지가 100이 넘으면 'O'표시

2)추가 칼럼 2: 칼럼 1이 'O'이거나 이전 1, 혹은 이전 2, 이전 3 셋 중 하나가 'O'이면 'O'표시

3)칼럼 2가 'O'면 출력할 것

 

위의 조건에 따라 아래와 같이 코드를 짜서 통과했고, 속도도 상위 2% 정도로 높게 나왔다.

하지만 길이가 너무 길다는게 흠이라서 추가로 풀이를 해봤다.

SELECT       id
            ,visit_date
            ,people
FROM        (
                    SELECT       ID
                                ,VISIT_DATE
                                ,PEOPLE
                                ,CASE WHEN OX = 'O'
                                        OR LAG(OX) OVER () = 'O'
                                        OR LAG(OX,2) OVER () = 'O' THEN 'O' ELSE 'X' END AS 'OX'
                    FROM        (
                                        SELECT       ID
                                                    ,VISIT_DATE
                                                    ,PEOPLE
                                                    ,CASE WHEN PEOPLE >= 100
                                                        AND LEAD(PEOPLE) OVER () >= 100
                                                        AND LEAD(PEOPLE, 2) OVER () >= 100 THEN 'O' ELSE 'X' END AS OX
                                        FROM         STADIUM
                                ) A
) B
WHERE        OX = 'O'

 

 

[풀이2]

위와 크게 다르진 않지만 더 짧게 푼 것.

서브쿼리를 한 개만 주고, 대신 조건절에서 케이스별 필터링을 자세하게 준 정도의 차이만 있다. 

SELECT       ID
            ,VISIT_DATE
            ,PEOPLE
FROM        (
                    SELECT       ID
                                ,VISIT_DATE
                                ,PEOPLE
                                ,LEAD(PEOPLE) OVER () AS NXT1
                                ,LEAD(PEOPLE, 2) OVER () AS NXT2
                                ,LAG(PEOPLE) OVER () AS PRV1
                                ,LAG(PEOPLE, 2) OVER () AS PRV2
                    FROM         STADIUM
            ) A
WHERE       (PEOPLE >= 100 AND NXT1 >= 100 AND NXT2 >= 100)
OR          (PEOPLE >= 100 AND PRV1 >= 100 AND NXT1 >= 100)
OR          (PEOPLE >= 100 AND PRV1 >= 100 AND PRV2 >= 100)