我在 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?
答案 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
)。