Для СУБД версии 8+ вы можете использовать аналитическую функцию c, такую как dense_rank()
SELECT record_id, client_id, policy_type, expiration_date
FROM
(
SELECT t.*,
dense_rank() over (partition by client_id, policy_type order by expiration_date desc) as dr
FROM tab t
) tt
WHERE dr = 1;
. Вышеуказанная группировка обрабатывается с помощью partition by
, а самая последняя дата получается с помощью Предложение order by
после фильтрации путем возврата значений 1
из функции analyti c
Для всех версий (особенно до 8) может использоваться следующий оператор
SELECT t1.record_id, t1.client_id, t1.policy_type, t1.expiration_date
FROM tab t1
JOIN
(
SELECT max(expiration_date) AS expiration_date, policy_type
FROM tab
GROUP BY client_id, policy_type
) t2
ON t2.expiration_date=t1.expiration_date AND t2.policy_type = t1.policy_type;
Учитывая ваш комментарий о том, что результаты должны быть для каждого клиента, я добавил столбец client_id
в список partition by
первого запроса и список GROUP BY
второго запроса.
Демо