我有一个很大的表,我想按一个列值对它进行分组,并生成另一个列值的聚合。作为一个聚合,我不关心实际值,只要它是一个值,出现在 * 任何 * 行的分组列。例如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
1条答案
按热度按时间dvtswwa31#
distinct on
将返回任意行:或者按照注解中的建议使用
min/max
。