使用where子句的2字段查询1字段

时间:2012-02-03 03:40:08

标签: database postgresql

我在 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

我如何获取每个数据的ID?我用来获得1个结果的查询是上面数据的id?

1 个答案:

答案 0 :(得分:1)

此查询适用于任何版本的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 或更高版本,您可以使用window function 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)

如果batch_no不应该是唯一的,那么每个merchant_id甚至会生成唯一的行。在这种情况下,我会选择最小的id(对于每batch_no最大的merchant_id),因为我还会按id对窗口进行排序。

我在这里使用DISTINCT,因为它在窗口函数之后应用(而不是GROUP BY)。