Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 데이터리안
- 순위함수
- python
- 리텐션
- pandas
- 취준
- regexp
- 린분석
- 서브쿼리
- 데이터분석
- SQL
- 독서
- SolveSQL
- funnel
- Datarian
- MYSQL
- 그로스해킹
- 신입 데이터분석가
- 윈도우 함수
- Retention
- rank
- row_number
- leetcode
- 퍼널분석
- advent of sql
- 프로그래머스
- 윈도우함수
- dense_rank
- 누적합
- LEFTJOIN
Archives
- Today
- Total
데이터 분석
[Day 16] solvesql | Advent of SQL 2024 | 스테디셀러 작가 찾기🔥 본문
스테디셀러 작가 찾기
✔️0212 0822 복습
문제 조건
1. 5년 이상 연속으로 베스트셀러 작품 목록에 이름을 올린 소설 작가와 연도 정보를 출력
2. 이때 서로 다른 작품이더라도 상관없음
3. 단, 같은 해에 여러 작품으로 베스트셀러 목록에 들어가더라도 1번으로 카운트
Solution
WITH T1 AS (
SELECT DISTINCT author
, year
FROM books
WHERE genre = 'Fiction'
), T2 AS (
SELECT author,
year,
LAG(year, 4) OVER (PARTITION BY author ORDER BY year) as lag_4
FROM T1
)
SELECT author,
MAX(year) as year,
COUNT(*) + 4 as depth
FROM T2
WHERE lag_4 IS NOT NULL AND (year - lag_4 = 4)
GROUP BY author
/*
WITH steady_seller AS (
SELECT *
, LAG(year, 4) OVER (PARTITION BY author ORDER BY year) AS lag_4 -- 최소 5년 연속 올랐다 치면, 무조건 "year-lag_4=4" 성립되어야 함
FROM (
SELECT DISTINCT author
, year
FROM books
WHERE genre = 'Fiction'
) AS preprocessed
)
SELECT author
, MAX(year) AS year
, MAX(year) - MIN(lag_4) + 1 AS depth
-- , COUNT(*) + 4 AS depth_1
FROM steady_seller
WHERE lag_4 IS NOT NULL
AND year - lag_4 = 4
GROUP BY author
*/
▶ T1 CTE:
소설 장르의 책만 필터링하고 중복된 (작가, 연도) 쌍을 제거한 테이블을 반환한다.
▶ T2 CTE:
5년 이상 연속으로 베스트셀러 작품 목록에 올랐는지 판단하기 위해 LAG 함수를 활용한다.
동일 작가의 베스트셀러 달성 연도 중, 현재 행에서 이전 4번째 행의 연도를 반환한다.
(예)

▶ 최종 SELECT:
(year - lag_4 = 4): 현재 연도(year)와 4번째 이전 연도(lag_4)가 정확히 4년 간격이어야 5년 이상 연속 조건을 만족한다.
(예)

피드백
LAG 함수
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)
column_name:
값을 참조할 열(컬럼)을 지정한다.
offset (선택 사항):
참조할 행의 상대적 위치를 지정한다.
기본값은 1로, 바로 이전 행의 값을 반환한다.
default_value (선택 사항):
참조하려는 행이 없을 경우 반환할 기본값을 지정한다.
기본값을 지정하지 않으면 NULL 반환
OVER (PARTITION BY ... ORDER BY ...):
PARTITION BY: 데이터를 그룹화하여 각각 독립적으로 처리한다. 생략하면 전체 데이터셋을 하나로 간주
ORDER BY: 참조할 이전 행의 순서를 지정
'SQL > solvesql' 카테고리의 다른 글
| [Day 18] solvesql | Advent of SQL 2024 | 펭귄 날개와 몸무게의 상관 계수 (1) | 2024.12.18 |
|---|---|
| [Day 17] solvesql | Advent of SQL 2024 | 멀티 플랫폼 게임 찾기 (1) | 2024.12.17 |
| [Day 15] solvesql | Advent of SQL 2024 | 폐쇄할 따릉이 정류소 찾기 2⭐🔥(논리) (1) | 2024.12.17 |
| [Day 14] solvesql | Advent of SQL 2024 | 전력 소비량 이동 평균 구하기💡 (2) | 2024.12.14 |
| [Day 13] solvesql | Advent of SQL 2024 | 게임 개발사의 주력 플랫폼 찾기⭐ (2) | 2024.12.13 |