1 분 소요

문제 링크

정답

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;