본문 바로가기
프로그래밍/SQL, Hive, SAS 관련 정보

[SQL 문제풀이] - 명시적 Group이 없을 때 Grouping (1)

by TrillionNT 2025. 1. 19.

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


https://www.hackerrank.com/challenges/sql-projects/problem?isFullScreen=true

 

SQL Project Planning | HackerRank

Write a query to output the start and end dates of projects listed by the number of days it took to complete the project in ascending order.

www.hackerrank.com

 

 

이 문제는 딱 봤을 때 먼저 paritioning 혹은 grouping 을 해야한다는 것을 알겠는데, 그것을 수행할 기준 변수가 없습니다. 그럼 우리가 직접 그 변수를 만들어야 겠죠? 저는 LAG 윈도우 함수를 이용해서 partition의 경계값에서 변화를 만들고 해결해보려다 실패했습니다. partitioning/grouping을 용이하게 하기위해서는 partition/group 안에서 같은 값을 가지면 좋겠죠? 그 트릭을 한 번 배워봅시다. 

핵심은 같은 프로젝트 내에서는 start date(end date)가 일정하게 1씩 늘어난다는 점입니다. 고정된 값에서 비교하기 어려우니 같은 속도로 변하는 변수를 하나 만들고 '상대적 비교' - 차이를 하면 그 상대값은 partitioning의 지표가 될 수 있다는 말입니다. 

 

select start_date, end_date, row_number() over(order by end_date) refd, 
       end_date-(row_number() over(order by end_date)) 
from Projects;

 

와 같이 코드를 먼저 한번 실행해볼까요? (참고로 DATE 데이터 형식이 +1, -1 같은 연산을 해주면 알아서 하루 다음, 하루 전의 값을 리턴해줍니다)

 

그럼 이제 paritioning을 이 변수를 기준으로 진행해주면 되겠군요.

select min(start_date), max(end_date)
from 
    (select start_date, end_date, row_number() over(order by end_date) refd
    from Projects)
group by (end_date-refd)
order by (max(end_date)-min(start_date)), min(start_date);