В PostgreSQL можно использовать DISTINCT ON с сортировкой по pickpoint_id и убывающему created. Для одинакового времени задайте дополнительное правило выбора, например максимальный уникальный id.
Получить последние процентные значения для каждого пункта выдачи
В PostgreSQL можно использовать DISTINCT ON с сортировкой по pickpoint_id и убывающему created. Для одинакового времени задайте дополнительное правило выбора, например максимальный уникальный id.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать SQL‑запрос, который возвращает самое свежие значение столбца percent для каждого pickpoint_id. Для каждой записи следует выбрать строку с максимальной датой в поле created. Пример структуры таблицы и ожидаемый результат:
CREATE TABLE pickpoint_tariff (
id bigserial,
created timestamp DEFAULT now(),
pickpoint_id bigint,
percent numeric
);
created | pickpoint_id | percent
-------------+--------------+---------
2024-01-01 | 1 | 2
2024-01-01 | 2 | 2
2024-01-01 | 3 | 2
2024-01-02 | 1 | 1
2024-01-02 | 2 | 1
2024-01-02 | 3 | 3
2024-01-03 | 1 | 3
2024-01-03 | 2 | 10
2024-01-04 | 2 | 20
2024-01-04 | 3 | 30
Ожидаемый вывод:
1 — 3
2 — 20
3 — 30
Ответ
В PostgreSQL можно использовать DISTINCT ON с сортировкой по pickpoint_id и убывающему created. Для одинакового времени задайте дополнительное правило выбора, например максимальный уникальный id.
Запрос:
SELECT DISTINCT ON (pickpoint_id) pickpoint_id, percent
FROM pickpoint_tariff
WHERE pickpoint_id IS NOT NULL
ORDER BY pickpoint_id, created DESC NULLS LAST, id DESC;
Для примера получатся 1—3, 2—20, 3—30. В схеме bigserial сам по себе не объявляет PRIMARY KEY: для гарантированного tie-breaker id должен быть уникальным. NULL-даты здесь уступают известным; если такие строки нужно исключить полностью, добавьте created IS NOT NULL.