postgresql 为组返回任意值的聚合函数

ecfdbz9o  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(155)

我有一个很大的表,我想按一个列值对它进行分组,并生成另一个列值的聚合。作为一个聚合,我不关心实际值,只要它是一个值,出现在 * 任何 * 行的分组列。例如coalesce()。一个聚合,它产生它在输入集中接收到的第一个非空值。
当然,coalesce()不是一个聚合函数,实际上没有一个聚合函数匹配我需要的行为,在文档中:

如何通过查询检索组中每个组的任何元素?我知道我可以使用min()max(),但我宁愿避免将所有值相互比较以确定结果。理想的解决方案是防止访问已经具有值的组的任何更多页面。这是一个大表(磁盘上有几GB),其中包含大组(数十万行)。
我看过there are recursive CTE and lateral joins。我试着把我的头绕到这些上面,看看这些是否有帮助...
下面是一个例子:

with t1(x) as (select * from generate_series(0, 10, 1)),
     t2(x, y) as (select * from t1, t1 t2)

select x
     , any_element(y) -- how can I simulate this any_element() aggregate function?
from t2
group by x
order by x
dvtswwa3

dvtswwa31#

distinct on将返回任意行:

with t1(x) as (select * from generate_series(0, 10, 1)),
     t2(x, y) as (select * from t1 a, t1 b)

select distinct on (x) x,y
from t2
where y is not null
order by x

或者按照注解中的建议使用min/max

相关问题