Window Function 예제

Jiwon Kim
|2023. 11. 16. 17:46

예제

  • leet code # 626
  • leet code # 1204

 

Leet Code #626. Exchange Seats

 

 

 

[ 문제상황 ] 

 

id - 학생이름이 나열되어 있는 테이블에서 

 -  (1,2) / (3,4) / ... 이웃된 학생끼리 id를 swap

 -  만약 학생 수가 홀수 명이라서 한 명이 남으면 그 학생은 id 유지 

 


 

[ 해결방법 ]

 

Sol 1 :

CASE WHEN 으로 케이스 분류

 

 

접근법 :

1. id가 짝수면 (2로 나눈 나머지가 0) 기존 id에서 1을 빼고,

2. id가 홀수면 (2로 나눈 나머지가 1) 기존 id에서 1을 더함.

3. 그런데 전체 학생 수가 홀수일 때 마지막 홀수 번호 학생은 1을 더해주면 안되니까 subquery 이용해서 case 나눠주기.

id = (SELECT COUNT(*) FROM Seat) : id = (전체 학생 수)인 경우 

 


 

 

Sol 2 : 

WINDOW FUNCTION 이용하기 

 

 

 

접근법 :

1. id가 짝수면 LAG현재 행보다 앞에 있는 값 (student의 이름) 을 추출 

2. id가 홀수면 LEAD현재 행보다 뒤에 있는 값 (student의 이름) 을 추출 

3. 그런데 마지막 학생의 id가 홀수 일때, "뒤에 있는 값"이 존재하지 않으므로, (즉 NULL이 됨)

    COALESCE 함수로 NULL을 "student" (현재 자기 이름)으로 대체 !

 

 

참고 1 :

postgresql 은 COALESCE( param1, param2 )

mysql 은 IFNULL(param1, param2)

- 만약 param1이 null이면 param2로 대체됨

 

 

참고 2 : 

mysql에서

COALESCE(val1, val2, val3, ... , valn) 는 

처음으로 null이 아닌 값을 돌려준다. 

그러니까 사실 참고 1에서 null이 예상되는 값을 앞에 넣는다면 mysql에서도 COALESCE 가능!

 

 

 


 

Leet Code #1204. Last Person to Fit in the Bus

 

 

[ 문제상황 ] 

 

승객별 id, 이름, 몸무게, 그리고 탑승순서 (turn)이 있는 표.

버스의 최대 허용 무게가 1000kg일 때 가장 마지막으로 탑승할 수 있는 사람의 이름을 return 하는 문제 !

 


 

[ 해결방법 ]

 

Sol  :

window function + subquery 

 

Code :

with cte AS (
 
  SELECT *, SUM(weight) OVER (ORDER BY turn ASC) AS total_weight
 
  FROM Queue
 
)
 
SELECT person_name   FROM cte
 
WHERE total_weight = (  SELECT MAX(total_weight)     FROM cte       WHERE total_weight <= 1000   )
 
 
 

접근법 :

 

1. 일단 서브쿼리로, 자기 탑승순서까지 승객들이 탑승했을 때의 총 무게를 새로운 컬럼으로 만들어주기 

   - over (order by turn asc) : 'turn'이라는 컬럼 오름차순으로 나열했을 때 첫 열부터 해당 열까지,, 에 대한 조건

2. 그 다음 그 서브쿼리를 이용해서 "누적 무게"가 1000 이하인 열들 중, 가장 큰 누적무게에 해당하는 행 골라주기 

3. 2에서 고른 행의 person name SELECT 해주기 

 


 

'Study > SQL' 카테고리의 다른 글

Union / Union All 예제  (2) 2023.12.04
SUB QUERY 예제  (0) 2023.10.23
SQL : timestamp 다루기  (0) 2023.10.17
SQL : Delete  (0) 2023.10.05
SQL : Update  (0) 2023.10.05