Этот запрос работает с любой версией PostgreSQL, даже до появления оконных функций ( PostgreSQL 8.3 или более ранних):
SELECT b.id, b.merchant_id, b.batch_no
FROM batch b
JOIN (
SELECT merchant_id, max(batch_no) AS batch_no
FROM batch
GROUP BY merchant_id
) bmax USING (merchant_id, batch_no)
Если batch_no
не должен быть уникальным для merchant_id
, вы можете получить несколько строк за merchant_id
.
С PostgreSQL 8.4 или более поздней версии вы используете оконную функцию first_value()
:
SELECT DISTINCT
merchant_id
, first_value(batch_no) OVER w
, first_value(id) OVER w
FROM batch
GROUP BY merchant_id
WINDOW w AS (PARTITION BY merchant_id ORDER BY batch_no DESC, id)
Это даже дает уникальные строки вmerchant_id, если batch_no
не должно быть уникальным.В этом случае будет выбран самый маленький id
(для самого большого batch_no
на merchant_id
), поскольку я дополнительно сортирую окно по id
.
Я использую DISTINCT
здесь, потому что этоприменяется после оконной функции (в отличие от GROUP BY
).