Получение самого свежего договора для каждого клиента

Используйте 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 по одной дате.

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

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

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

Подробнее