문제:
스스로 풀지 못 함 ㅠ!
다른 사람 풀이:
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)
이런 기발한 생각은 어떻게 하나 몰라~!
'SQL > LeetCode&HackerRank' 카테고리의 다른 글
[MySQL] Leetcode - 585. Investments in 2016 (0) | 2024.02.05 |
---|---|
[MySQL] Hackerrank - Occupations (1) | 2024.01.30 |
[MySQL] Leetcode - 1045. Customers Who Bought All Products (0) | 2024.01.29 |
[MySQL] HackerRank - SQL Project Planning (0) | 2024.01.22 |
[MYSQL] LeetCode 184, 185 - Window Function 사용 풀이 (0) | 2023.05.14 |