Поле запроса 1 с использованием поля 2 для предложения where - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть такая таблица в POSTGRESQL :

Column       |            Type             | Modifiers 
---------------+-----------------------------+-----------
id           | smallint                    | not null
merchant_id  | smallint                    | not null
batch_no     | smallint                    | not null

У меня такой запрос:

select merchant_id , max(batch_no) from batch group by merchant_id

возвращает значение, подобное этому:

       merchant_id | max  
-------------------+------
                14 |  593
                45 |    1
                34 |    3
                46 |    1
                25 |  326
                27 |   61
                17 |    4

как я могу получить идентификатор каждого из данных? какой запрос я могу использовать, чтобы получить 1 результат, который является идентификатором данных выше?

1 Ответ

1 голос
/ 03 февраля 2012

Этот запрос работает с любой версией 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...