[solvesql - day 16] lv5 스테디셀러 작가 찾기

데프·2024년 12월 22일
post-thumbnail

👉 문제 바로가기 : solvesql - Advent of SQL 2024 DAY 16
저작권 문제로 링크만 첨부한다.

✔️문제 풀이에 필요한 점

연속된 일수를 구할 수 있어야 한다.
hackerank에도 이런 문제가 있었는데 당시에도 곤혹을 겪었던 기억이 있다.

방법은 여러가지가 있겠지만 lag() over() 함수를 이용하여 구현하는 것이 일반적일 것이다.

어떻게 풀든 논리적 과정이 필요한 작업이라 sql에서 구현하는 것은 비효율적으로 생각된다.
하지만 sql 고급 사용자가 되려면 당연히 수행할 수 있어야한다.

✍️답안

WITH fictions AS (
  SELECT DISTINCT
    author
    , year
  FROM
    books
  WHERE
    genre = 'Fiction'
  ORDER BY
    1, 2
) 
SELECT
  author
  , max(year) year
  , count(*) depth
FROM
  (
    SELECT 
      year
      , author
      , year - row_number() over() grp_num
    FROM
      fictions
  ) a
GROUP BY
  author
  , grp_num
HAVING
  depth >= 5
;

답안 설명

  1. 임시테이블(fictions)에선 Fiction 장르만 중복없이 추출한다.
  2. 본문의 서브쿼리에선 year - 행넘버를 수행한다.
    • 이 값이 일치하는 경우 값이 연속된다.
  3. 메인쿼리에선 결과에 필요한 집계함수를 수행한다.

핵심은 2번을 수행할 수 있느냐 없느냐이다.
연속이라는 조건을 구한다는게 sql에서 흔하지 않기 때문에 한 번 알아두면 간편하게 사용할 수 있다.

  • 응용 - 연속된 홀수 년도 구하기
( row_number() over() * 2 - 1 )

row_number를 이렇게 수정하면 홀수년도에 연속되는지 구할수 있다.

year - row_number() over()
→ year - ( row_number() over() * 2 - 1 )

profile
정보의 홍수를 기록하는 데프의 로그

0개의 댓글