SQL‑запрос, возвращающий актуальные процентные ставки для каждого пункта выдачи

Выберите последнюю запись каждого point_id, а полный список точек присоедините слева. Тогда точка 6 без тарифа тоже будет в результате с NULL, а не исчезнет.

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

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

Выберите последнюю запись каждого point_id, а полный список точек присоедините слева. Тогда точка 6 без тарифа тоже будет в результате с NULL, а не исчезнет.

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

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

Условие

Сформировать запрос, который отобразит последние известные процентные значения для всех пунктов выдачи.

create table pp_tariff
(
  tariff_id   bigserial,
  created_at  timestamp default now(),
  point_id    bigint,
  rate        numeric
);

Список пунктов: 1,2,3,4,5,6

Пример записей в таблице: 1 - 02.10 - 1 - 2% 2 - 02.10 - 2 - 2% 3 - 02.10 - 3 - 2% 4 - 02.10 - 4 - 2% 5 - 02.10 - 5 - 2% 6 - 03.10 - 1 - 3% 7 - 03.10 - 4 - 1% 8 - 03.10 - 2 - 5%

Ответ

Выберите последнюю запись каждого point_id, а полный список точек присоедините слева. Тогда точка 6 без тарифа тоже будет в результате с NULL, а не исчезнет.

Для PostgreSQL:

WITH points(point_id) AS (
    VALUES (1),(2),(3),(4),(5),(6)
), latest AS (
    SELECT DISTINCT ON (point_id) point_id, rate
    FROM pp_tariff
    ORDER BY point_id, created_at DESC NULLS LAST, tariff_id DESC
)
SELECT p.point_id, l.rate
FROM points AS p
LEFT JOIN latest AS l USING (point_id)
ORDER BY p.point_id;

По примеру ставки: 1→3, 2→5, 3→2, 4→1, 5→2, 6→NULL. При равном времени используем максимальный tariff_id; для детерминированности закрепите его уникальность. Единицы хранения rate должны соответствовать договорённости о процентах.

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

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

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

Подробнее