연속된 두 학생의 좌석 ID를 교환하는 쿼리를 작성하는 문제입니다! (학생수가 홀수인 경우, 마지막 학생은 바뀌지 않음)
Write a solution to swap the seat id of every two consecutive students. If the number of students is odd, the id of the last student is not swapped. Return the result table ordered by id in ascending order.
SELECT CASE WHEN mod(id,2) = 1 AND id = (SELECT max(id) FROM Seat) THEN id # CASE 1
WHEN mod(id,2) = 0 THEN id - 1 # CASE 2
ELSE id + 1 # CASE 3
END AS id , student
FROM Seat
ORDER BY id
CASE WHEN
와mod()
를 이용하여 ID 조건을 차례대로 적용했습니다. 조건을 하나씩 설명해보면
ID가 홀수이고 가장 마지막 ID를 갖는 학생의 경우 그대로 ID를 둡니다. 위 테이블의 경우 홀수이고, 가장 마지막 ID 인 5번 학생의 경우 입니다.
왜 이조건을 먼저 두어야하나!?
CASE WHEN
의 경우 첫번째 조건절 부터 적용이되기 때문에 가장 까다로운(?) 조건을 먼저 써줘야합니다 ㅎㅎ 앞으로 나올 조건에 덮혀씌우지 않도록요mod()
? 나머지를 구하는 함수입니다. 위함수를 이용해서 짝수, 홀수 ID를 구분합니다.ID | AFTER |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | 5 |
ID가 짝수인 경우 해당 ID 값에서 1을 빼줍니다 (ID가 짝수인 경우 1을 빼줘서 그 직전의 홀수값 ID로 만드는 아이디어)
ID | AFTER |
---|---|
1 | |
2 | 1 |
3 | |
4 | 3 |
5 | 5 |
그리고 자동적으로 남게 되는 나머지 홀수 ID는 반대로 +1 하여 그 다음 짝수ID로 바꿔줍니다
ID | AFTER |
---|---|
1 | 2 |
2 | 1 |
3 | 4 |
4 | 3 |
5 | 5 |
위 조건으로 나열된 AFTER(ID) 순으로 , ID와 STUDENT를 가져오면 끝!