Условие
Таблица Seat(id, student). id идут подряд от 1 до N. Поменяйте местами соседних: (1,2) → (2,1), (3,4) → (4,3) и т.д. Если N нечётно — последний остаётся на месте. Вернуть в порядке id.
Решение
Через CASE по чётности id
SELECT
id,
CASE
WHEN id % 2 = 1 AND id = (SELECT MAX(id) FROM Seat) THEN student
WHEN id % 2 = 1 THEN LEAD(student) OVER (ORDER BY id)
ELSE LAG(student) OVER (ORDER BY id)
END AS student
FROM Seat
ORDER BY id;Альтернатива через id-инверсию
SELECT
CASE
WHEN id % 2 = 1 AND id = (SELECT MAX(id) FROM Seat) THEN id
WHEN id % 2 = 1 THEN id + 1
ELSE id - 1
END AS id,
student
FROM Seat
ORDER BY id;Это перепаривает id (нечётный + 1, чётный – 1, последний нечётный оставляем). Финальный ORDER BY id восстанавливает порядок.
Подводные камни
- Нечётный N. Последний нечётный id не имеет пары — оставляем как есть, иначе он «обменяется в никуда» и пропадёт.
LEAD/LAGна границе.LEAD(student) OVER (ORDER BY id)на последней строке вернёт NULL. Поэтому первый WHEN — обработка хвоста.- Дыры в id. Если id не идут подряд (что в задаче исключено),
id+1/id-1сломаются. ИспользоватьROW_NUMBER()поверх id и переставлять номера.
Эталонный ответ
Два подхода: (а) CASE + LEAD/LAG подменяет student; (б) пересчёт id через CASE. Оба хвостом обрабатывают нечётное N. Вариант (б) короче и без оконных функций.