SQL 코드카타_SQL Project Planning
문제 : SQL Project Planning
# 목적, 목표 : 프로젝트 완료 기간 기준 오름차순으로 시작일과 종료일 출력
# 필요한 컬럼 : Start_Date, End_Date
# 컬럼 조건 : 이전 행과 비교 (LAG)
# 사용할 테이블 : Projects
# join key : 없음
# 테이블 조건 : 시작일 = 이전 행의 종료일 → 동일한 프로젝트, 시작일 != 이전 행의 종료일 → 개별 프로젝트
# 필요한 그룹 : 없음
# 필요한 그룹 조건 : 없음
# 정렬 기준 : 프로젝트 완료 기간 기준 오름차순, 시작일을 기준 오름차순
# 주의사항 : 동일한 프로젝트라면, 시작일 = 첫 작업의 시작일, 종료일 = 끝 작업의 종료일이어야 함
로직
WITH A as( SELECT Start_Date, LAG(End_Date) OVER (ORDER BY Start_Date) AS LAG_End, End_Date FROM Projects), B as ( SELECT Start_Date, LAG_End, End_Date FROM A WHERE Start_Date != LAG_End OR LAG_End is null), C as ( SELECT Start_Date, LAG_End, End_Date, LEAD(LAG_End) OVER (ORDER BY Start_Date) AS LEAD_End FROM B), D as ( SELECT Start_Date, CASE WHEN LEAD_End is null THEN End_Date ELSE LEAD_End END AS End_Date FROM C), E as ( SELECT Start_Date, End_Date, DATEDIFF(End_Date, Start_Date)+1 AS Days FROM D) SELECT Start_Date, End_Date FROM E ORDER BY Days, Start_Date
[ 쿼리 뜯어보기 ]
# A 테이블 : Start_Date와 이전 행의 End_Date를 비교하기 위해 LAG_End 컬럼 생성
WITH A as(
SELECT Start_Date, LAG(End_Date) OVER (ORDER BY Start_Date) AS LAG_End, End_Date
FROM basic.Projects),
# B 테이블 : 개별 프로젝트만 추출
B as (
SELECT Start_Date, LAG_End, End_Date
FROM A
WHERE Start_Date != LAG_End OR LAG_End is null),
# C 테이블 : 동일 프로젝트 종료일을 알맞게 배치하기 위해 LEAD_End 컬럼 생성
C as (
SELECT Start_Date, LAG_End, End_Date, LEAD(LAG_End) OVER (ORDER BY Start_Date) AS LEAD_End
FROM B),
# D 테이블 : 동일 프로젝트 종료일을 알맞게 배치하기
D as (
SELECT Start_Date,
CASE WHEN LEAD_End is null THEN End_Date
ELSE LEAD_End END AS End_Date
FROM C),
# E 테이블 : 프로젝트 기간 산정하기
E as (
SELECT Start_Date, End_Date, DATEDIFF(End_Date, Start_Date)+1 AS Days
FROM D)
# 프로젝트 기간, 시작일 기준 오름차순 정렬하기
SELECT Start_Date, End_Date
FROM E
ORDER BY Days, Start_Date
[ 어려웠던 점 ]
[ 새로 알게된 점 ]
SQL 코드카타_SQL Placements
문제 : Placements
# 목적, 목표 : 가장 친한 친구가 자신보다 더 높은 급여를 제안받은 학생들의 이름을 출력
# 필요한 컬럼 : ID, Friend_ID, Salary, Name
# 컬럼 조건 :
# 사용할 테이블 : Packages, Friends, Salary
# join key : ID, Friend_ID
# 테이블 조건 : 가장 친한 친구가 자신보다 더 높은 급여
# 필요한 그룹 : 없음
# 필요한 그룹 조건 : 없음
# 정렬 기준 : 가장 친한 친구에게 제안된 급여를 기준으로 정렬
로직
WITH A AS (
SELECT f1.ID, p2.Salary
FROM Packages p1 inner join Friends f1 on p1.ID = f1.ID inner join Packages p2 on f1.Friend_ID = p2.ID
WHERE p2.Salary > p1.Salary)
SELECT s.Name
FROM A a inner join Students s on a.ID = s.ID
ORDER BY a.Salary
[ 쿼리 뜯어보기 ]
# A 테이블 : 가장 친한 친구가 자신보다 더 높은 급여를 제안받은 ID만 추출
WITH A AS (
SELECT f1.ID, p2.Salary
FROM Packages p1 inner join Friends f1 on p1.ID = f1.ID inner join Packages p2 on f1.Friend_ID = p2.ID
WHERE p2.Salary > p1.Salary)
# Name 추출 및 급여 오름차순으로 정렬
SELECT s.Name
FROM A a inner join Students s on a.ID = s.ID
ORDER BY a.Salary
[ 어려웠던 점 ]
[ 새로 알게된 점 ]
sql도 뿌셔뿌셔 마초수노 화이팅