Выберите последнюю запись каждого point_id, а полный список точек присоедините слева. Тогда точка 6 без тарифа тоже будет в результате с NULL, а не исчезнет.
SQL‑запрос, возвращающий актуальные процентные ставки для каждого пункта выдачи
Выберите последнюю запись каждого 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 должны соответствовать договорённости о процентах.