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);
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL 기초] 최빈값 찾아내기 (0) | 2025.01.30 |
---|---|
[SQL 기초] 집계함수의 특성을 활용한 조건 별 집계 (2) | 2025.01.27 |
[SQL 기초] 집계 함수의 적용 (1) | 2025.01.19 |
[SQL 문제풀이] - 다중 join + group by의 적용 (0) | 2025.01.19 |
[SQL 기초] CASE WHEN (1) | 2025.01.19 |