Используйте ROW_NUMBER по каждому client с сортировкой по date убыванию. В примере будут Jan от 3 января, Alice от 6 января и Bod от 9 января 2000 года.
Получение самого свежего договора для каждого клиента
Используйте ROW_NUMBER по каждому client с сортировкой по date убыванию. В примере будут Jan от 3 января, Alice от 6 января и Bod от 9 января 2000 года.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В таблице contract хранятся сведения о договорах клиентов. У одного клиента может быть несколько записей с разными датами заключения. Необходимо составить SQL‑запрос, который для каждого клиента (поле client) выберет запись с наибольшей датой (date) – то есть самый актуальный договор.
CREATE TABLE contract (id integerm client varchar(100), date date)
INSERT INTO contract(id, client, date) VALUES (1, 'Jan', '2000-01-01');
INSERT INTO contract(id, client, date) VALUES (2, 'Jan', '2000-01-02');
INSERT INTO contract(id, client, date) VALUES (3, 'Jan', '2000-01-03');
INSERT INTO contract(id, client, date) VALUES (1, 'Alice', '2000-01-04');
INSERT INTO contract(id, client, date) VALUES (2, 'Alice', '2000-01-05');
INSERT INTO contract(id, client, date) VALUES (3, 'Alice', '2000-01-06');
INSERT INTO contract(id, client, date) VALUES (1, 'Bod', '2000-01-07');
INSERT INTO contract(id, client, date) VALUES (1, 'Bod', '2000-01-08');
INSERT INTO contract(id, client, date) VALUES (1, 'Bod', '2000-01-09');
Ответ
Используйте ROW_NUMBER по каждому client с сортировкой по date убыванию. В примере будут Jan от 3 января, Alice от 6 января и Bod от 9 января 2000 года.
Для PostgreSQL:
WITH ranked AS (
SELECT c.*, ROW_NUMBER() OVER (
PARTITION BY client ORDER BY date DESC NULLS LAST, id DESC
) AS rn
FROM contract c
)
SELECT id, client, date
FROM ranked
WHERE rn = 1
ORDER BY client;
В DDL опечатка: нужно id integer, а не integerm. Если и дата, и id совпадают, для полностью детерминированного выбора нужен уникальный ключ. Если требуется вернуть все договоры на максимальную дату, используйте другой контракт, например RANK по одной дате.