-- Дана таблица numbers с одной колонкой num (целые числа, могут повторяться).

Разделите числа по чётности, независимо пронумеруйте обе группы и соедините их FULL OUTER JOIN по номеру строки. Повторы сохраняются.

Короткий ответ

Что ответить на собеседовании

Разделите числа по чётности, независимо пронумеруйте обе группы и соедините их FULL OUTER JOIN по номеру строки. Повторы сохраняются.

Подробный разбор

Ответ с пояснениями

Условие

-- Дана таблица numbers с одной колонкой num (целые числа, могут повторяться). -- Напишите SQL запрос, который разделит числа на две колонки: -- even – чётные числа (отсортированные по возрастанию) -- odd – нечётные числа (отсортированные по возрастанию) -- Числа должны располагаться строка за строкой: в первой строке – первое чётное и первое нечётное, -- во второй строке – второе чётное и второе нечётное и т.д. -- Если в одной из групп чисел больше, чем в другой, на недостающих местах должно быть NULL.

-- исходная таблица -- num


-- [phone]

-- результат запроса

-- even | odd -- -----|----- -- 2 | 1 -- 4 | 3 -- 6 | 5 -- 8 | 7 -- 10 | 9 -- NULL | 11 -- NULL | 11

Ответ

Разделите числа по чётности, независимо пронумеруйте обе группы и соедините их FULL OUTER JOIN по номеру строки. Повторы сохраняются.

Для PostgreSQL:

WITH evens AS (
    SELECT num, ROW_NUMBER() OVER (ORDER BY num) AS rn
    FROM numbers WHERE num % 2 = 0
), odds AS (
    SELECT num, ROW_NUMBER() OVER (ORDER BY num) AS rn
    FROM numbers WHERE num % 2 <> 0
)
SELECT e.num AS even, o.num AS odd
FROM evens e
FULL OUTER JOIN odds o ON e.rn = o.rn
ORDER BY COALESCE(e.rn, o.rn);

FULL JOIN сохраняет хвост более длинной группы, заполняя другую колонку NULL. Проверка <> 0 работает и для отрицательных нечётных чисел. Исходные NULL здесь исключены; отдельное правило для них условием не задано.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее