首页 > 解决方案 > 获取组中具有最大值的行加上组的总和

问题描述

基本上,我有一个看起来像这样的表:

Fruit | Juiciness | Brand | Price
---------------------------------
Apple |     2     |   A   | 0.50
Pear  |     1     |   A   | 0.70
Plum  |     6     |   A   | 0.40
Kiwi  |     5     |   B   | 0.80
Grape |     4     |   B   | 0.01

我希望输出两行,一行用于品牌 A,一行用于品牌 B,其中包含最多汁水果的名称(最大多汁性值),以及该品牌所有水果的总价格。所以:

Fruit | Brand | Price
---------------------------------
Plum  |   A   | 1.60
Kiwi  |   B   | 0.81

我正在考虑将其分解为几个不同的 CTE/子查询,一个是简单的SUM(Price),一个是一个DISTINCT ONORDER BY获得最多汁的水果,然后将它们重新组合在一起。但不知何故,即使那对我也不起作用。(关于我不想表现出多汁性的事情似乎一直在绊倒 Postgres,但我不确定。)

标签: sqlpostgresqlaggregate-functionsgreatest-n-per-groupwindow-functions

解决方案


您需要两个聚合:总和和最大值,并且两次都希望按品牌分组。具有挑战性的部分是您也想要水果名称(否则会很容易)。

因此,首先将总和与窗口函数相加,然后为每个组只获取最多汁的水果:

SELECT DISTINCT ON (brand)
       fruit,
       brand,
       sum AS price
FROM (SELECT fruit,
             juiciness,
             brand,
             sum(price) OVER (PARTITION BY brand) AS sum
      FROM mytable) AS subq
ORDER BY brand, juiciness DESC;

使用窗口函数,您通常会得到子查询。


推荐阅读