问题是:
如何获取由聚合函数选择的行?
该问题已得到回答,并且部分解决了我的问题。但是我仍然无法用
我需要两个操作:
1. 选择汇总行的
用户消耗了一定数量的资源。白天的一部分10小时用户消耗了
我通过下面的查询完成这个任务:
为什么不允许在
当找到第一个不同的行时,它会保存其
当找到第一个不同的行时,它会保存其
下一次找到第二个及更多非重复行时,它将调用
如果第二个和/或下一个非重复行中的任何一个具有更大的
如果存在
如何获取由聚合函数选择的行?
该问题已得到回答,并且部分解决了我的问题。但是我仍然无法用
DISTINCT ON
替换GROUP BY
,因为有以下原因:我需要两个操作:
1. 选择汇总行的
id
(可以使用DISTINCT ON
解决)
2. 对ratio
列求和(可以使用GROUP BY
解决)用户消耗了一定数量的资源。白天的一部分10小时用户消耗了
8
,另一部分10小时用户消耗了3
,而4小时他没有消耗资源。任务是按最大值计费已消耗的资源,并在未使用资源时不进行计费。 id | name | amount | ratio
----+------+--------+-------
1 | a | 8 | 10
2 | a | 3 | 10
我通过下面的查询完成这个任务:
SELECT
(
SELECT id FROM t2
WHERE id = ANY ( ARRAY_AGG( tf.id ) ) AND amount = MAX( tf.amount )
) id,
name,
MAX(amount) ma,
SUM( ratio )
FROM t2 tf
GROUP BY name
为什么不允许在
DISTINCT ON
中使用聚合函数?select distinct on ( name ) id, name, amount, sum( ratio )
from t2
order by name, amount desc
甚至更简单:
select distinct on ( name ) id, name, max(amount), sum( ratio )
from t2
这也将解决与ORDER BY
相关的问题。不需要使用子查询的解决方法。
是否有技术原因导致最后一个示例中描述的查询无法正常工作?
更新
理论上,它可以像下面这样工作:
第一个示例:
select distinct on ( name ) id, name, amount, sum( ratio )
from t2
order by name, amount desc
当找到第一个不同的行时,它会保存其
id
和name
下一次找到第二个及以后的非重复行时,它将调用sum
并累加ratio
第二个示例:select distinct on ( name ) id, name, max(amount), sum( ratio )
from t2
当找到第一个不同的行时,它会保存其
id
和name
,累加ratio
并将当前值的ratio
设置为最大值。下一次找到第二个及更多非重复行时,它将调用
sum
并累加ratio
。如果第二个和/或下一个非重复行中的任何一个具有更大的
ratio
列值,则将其保存为maximum,并更新id
的保存值。
更新:如果存在
amount = max(amount)
的多行,则Postgres可以从任一行返回值。由于这是针对未在DISTINCT ON下的任何字段执行的操作,因此可以通过ORDER BY
子句限定查询以确保返回哪个值。就像这里所做的那样。
GROUP BY
替换为DISTINCT
:https://stackoverflow.com/a/67167595/4632019 - Eugen Konkov