Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 626

leet code sql 626
문제

  • 두 id가 연속되어 있는 경우에, 위치를 바꾸어서 출력
  • 다만, 마지막 혼자 남는 경우에는 그대로 이름을 나둔다.
문제 접근

  • lead, lag 함수를 활용하여 현재 값을 기준으로 위 아래 값을 가져온다.
  • 홀수인 경우에는 본인 이후 값을, 짝수인 경우에는 본인 이전 값을 가져온다.
  • if 함수를 활용하여 경우의 수 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
with seat_info as (
select
    id,
    student,
    lead(student, 1) over() lead_student,
    lag(student, 1) over() lag_student
from Seat a
)
select 
    id,
    if(id%2=0, lag_student, if(id = (select max(id) from Seat), student, lead_student)) student
from seat_info
order by id;
  • 한발짝 더 나아가 생각해본다면, 현재 학생의 id를 새롭게 갱신하여 주면 된다.
  • 두 개의 속도 차이는 별도로 나지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with cte as (
select 
    *, 
    lead(id) over(order by id) as next,
    lag(id) over(order by id) as prev
from seat
)
select case 
          when((id%2 =1)  and next is not null) then next
          when (id%2 = 0)  then prev
          else id 
          end as id,
   student
from cte
order by id;