
👉 문제 바로가기 : 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
;
year - 행넘버를 수행한다.핵심은 2번을 수행할 수 있느냐 없느냐이다.
연속이라는 조건을 구한다는게 sql에서 흔하지 않기 때문에 한 번 알아두면 간편하게 사용할 수 있다.
연속된 홀수 년도 구하기( row_number() over() * 2 - 1 )
row_number를 이렇게 수정하면 홀수년도에 연속되는지 구할수 있다.
year - row_number() over()
→ year - ( row_number() over() * 2 - 1 )