[Leetcode] Human Traffic Of Stadium
정답
SELECT DISTINCT A.*
FROM Stadium A, Stadium B, Stadium C
WHERE
A.people >= 100 AND B.people >= 100 AND C.people >= 100
AND (
(A.id + 1 = B.id AND B.id + 1 = C.id)
OR (A.id - 1 = B.id AND A.id + 1 = C.id)
OR (A.id - 1 = B.id AND B.id - 1 = C.id)
)
ORDER BY A.visit_date;
✅ Point
- 최소 3행이 연속적으로 people >= 100 을 만족하는 경우 출력
- 조건은 최소 3 행. 그 이상인 경우에도 모두 출력해야 함 -> A를 기준 날짜로 볼 때, 앞/뒤 행 모두 고려해야 함
- 중복된 값이 출력되지 않도록
DISTINCT A.*
만 출력
다른 풀이
- 기준 행(100 이상을 만족) 의 -2, -1, +1, +2 번 째 id 가져오기
- 기준 행으로부터 id가 연속적인 경우 출력
WITH CTE AS (
SELECT *,
LAG(id, 1) OVER (ORDER BY id) prev_1,
LAG(id, 2) OVER (ORDER BY id) prev_2,
LEAD(id, 1) OVER (ORDER BY id) next_1,
LEAD(id, 2) OVER (ORDER BY id) next_2
FROM Stadium
WHERE people >= 100
)
SELECT id, visit_date, people
FROM CTE
WHERE
(prev_2 + 1 = prev_1 AND prev_1 + 1 = id)
OR (prev_1 + 1 = id AND id + 1 = next_1)
OR (id + 1 = next_1 AND next_1 + 1 = next_2)
ORDER BY visit_date;