Задачи на оконные функции SQL
Оконные функции·junior

Выведи отсортированные значения парами в две колонки

Эту задачку любят на собеседованиях как проверку на знание оконных функций: с виду перекладывание значений, а на деле нужно сообразить про LEAD и фильтр по чётности.

Задача

Есть таблица с одним столбцом id, значения отсортированы, количество строк может быть нечётным:

id: 1, 2, 3, 4, 5, 7

Выведи значения парами в две колонки — следующее значение рядом с предыдущим. Если строк нечётное число, последнему без пары поставь NULL:

1 | 2
3 | 4
5 | NULL   (если строк нечётное число)

Схема данных

CREATE TABLE ids (
  id int
);

В песочнице шесть значений: 1, 2, 3, 4, 5, 7 — чётное число, так что последняя пара получится полной.

Решение

WITH t AS (
  SELECT id,
         LEAD(id) OVER (ORDER BY id) AS next_id,
         ROW_NUMBER() OVER (ORDER BY id) AS rn
  FROM ids
)
SELECT id, next_id
FROM t
WHERE rn % 2 = 1
ORDER BY id;

Разбор

Идея в двух оконных функциях, которые считаются на одном и том же порядке ORDER BY id. LEAD(id) подтягивает в текущую строку значение следующей строки — так рядом с каждым числом оказывается его сосед справа. ROW_NUMBER() нумерует строки по порядку: 1, 2, 3, ...

Теперь ключевой ход — фильтр WHERE rn % 2 = 1. Он оставляет только строки с нечётным номером: первую, третью, пятую. Именно они — «левые» элементы пар, а LEAD уже приклеил к ним «правые». Строки с чётными номерами выкидываем, иначе пары задвоятся.

Откуда берётся NULL? LEAD у самой последней строки не находит следующей и возвращает NULL. Это срабатывает автоматически, когда строк нечётное число: последний нечётный rn не имеет соседа справа. На данных песочницы строк шесть (чётно), поэтому последняя пара получается полной — 5 | 7, без NULL. Про то, как оконные функции считают значения соседних строк и почему не схлопывают набор, — в вопросе что такое оконные функции.

Ожидаемый результат

id | next_id
--- | ---
1 | 2
3 | 4
5 | 7

Прорешай такие задачи сам

Читать разбор полезно, а настоящая прокачка — самому писать запросы и получать обратную связь. В симуляторе живая база и проверка запросов, лёгкий режим — бесплатно.

Прорешать в бесплатной песочнице

Смежные задачи

Вопросы по теме