본문 바로가기

SQL/LeetCode&HackerRank

[MySQL] Leetcode - 601. Human Traffic of Stadium

문제:

 

스스로 풀지 못 함 ㅠ! 

 

다른 사람 풀이:

 

1. 관중 100이 넘는 조건이 걸린 테이블에서 id - ROW_NUMBER() OVER (ORDER BY id) AS diff 컬럼 만든 후, 위드문에 저장

WITH tb AS (
    SELECT *
        , id - ROW_NUMBER() OVER (ORDER BY id) AS diff
    FROM stadium s
    WHERE people >= 100
    ORDER BY visit_date )

 

100 조건이 없었으면 id - row_number() OVER (ORDER BY id) = 0 이었을테지만,

조건 때문에 없어지는 id가 있어서

id가 끊길 때마다 diff 값이 증가하게 되고, 연속된 숫자끼리는 같은 diff 값을 가짐!

이 말이 무슨 뜻이냐면

 

<테이블 예시>

| id | visit_date | people | rownum | diff |

| -- | ---------- | ------ | ------ | ---- |

| 2 | 2017-01-02 | 109 | 1 | 1 |

| 3 | 2017-01-03 | 150 | 2 | 1 |

| 5 | 2017-01-05 | 145 | 3 | 2 |

| 6 | 2017-01-06 | 1455 | 4 | 2 |

| 7 | 2017-01-07 | 199 | 5 | 2 |

| 8 | 2017-01-09 | 188 | 6 | 2 |

 

키포인트는 (( 연속된 숫자끼리는 같은 diff 값을 가짐! ))

이제 연속된 숫자 그룹을 구분할 수 있게 되었음 (diff 1 그룹, diff 2 그룹)

 

2. GROUP BY diff 했을 때, 카운트가 3 이상이면 3개 이상 연속되는 숫자 그룹임 따라서 WHERE절에서 diff 값이 카운트 3 이상인 diff만 가져오도록 조건을 걸면 됨

WITH tb AS (
    SELECT *
        , id - ROW_NUMBER() OVER (ORDER BY id) AS diff
    FROM stadium s
    WHERE people >= 100
    ORDER BY visit_date )

SELECT id
     , visit_date
     , people
FROM tb1
WHERE diff IN (
    SELECT diff
    FROM tb2
    GROUP BY diff
    HAVING COUNT(*) >= 3)

 

이런 기발한 생각은 어떻게 하나 몰라~!