[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)
'TIL 통합 > SQL' 카테고리의 다른 글
[SOLVESQL] 스테디 셀러 작가 찾기 - DISTINCT와 윈도우함수 (0) | 2025.04.11 |
---|---|
[LEETCODE] Tree Node : DISTINCT - LEFT JOIN 활용 (0) | 2025.04.09 |
[LEETCODE] 262. Trips and Users: WHERE절 활용 (0) | 2025.04.07 |
[LEETCODE] PRODUCT SALES ANALYSIS 3 - WHERE 응용 (0) | 2025.04.05 |
[프로그래머스] 우유와 요거트가 담긴 장바구니(GROUP_CONCAT or HAVING 활용) (1) | 2025.04.03 |