Postgresql 为组返回任何值的聚合函数

Postgresql 为组返回任何值的聚合函数,postgresql,aggregate-functions,Postgresql,Aggregate Functions,我有一个大表,我想按一个列值对它进行分组,并生成另一个列值的聚合。作为一个聚合,我不关心实际值,只要它是一个出现在grouped by列的任何行中的值。类似于coalesce(),例如,生成输入集中接收的第一个非空值的聚合 当然,它不是一个聚合函数,在文档中,实际上没有与我需要的行为相匹配的聚合函数: 如何通过查询检索group by中每个组的任何元素? 我知道我可以使用min()或max()但我宁愿避免将所有值相互比较以确定结果。理想的解决方案是,如果一个组已经有了一个值,那么该解决方案

我有一个大表,我想按一个列值对它进行分组,并生成另一个列值的聚合。作为一个聚合,我不关心实际值,只要它是一个出现在grouped by列的任何行中的值。类似于
coalesce()
,例如,生成输入集中接收的第一个非空值的聚合

当然,它不是一个聚合函数,在文档中,实际上没有与我需要的行为相匹配的聚合函数:

如何通过查询检索group by中每个组的任何元素? 我知道我可以使用
min()
max()
但我宁愿避免将所有值相互比较以确定结果。理想的解决方案是,如果一个组已经有了一个值,那么该解决方案就可以防止访问更多的页面。这是一个大表(磁盘上有几GB),包含大量组(数十万行)

我看到了。我正试着把我的头绕在这些东西上,看看这些东西是否有帮助

下面是一个例子:

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

distinct on
将返回任何行:

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

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

或者只使用注释中建议的
min/max

如果您不关心值,那么只需使用
min()
max()
@a_horse\u和\u no\u名称,这将是我的退路,但我特别感兴趣的是不必比较组中的所有值来找到最小值或最大值。我已经查看了,但我不确定它们是如何工作的。它们是否启用快捷方式?捷径天生就不可能吗?我不认为
min()
的比较部分会让你慢下来。这是扫描所有行并创建组的过程。除非每个组有很多行(例如,每个组有数百万行),否则查找最小值(或最大值)将是整个步骤中最便宜的部分。我不知道分组是如何实现的。但是,一个能够防止已经有价值的群体再点击更多页面的解决方案将是理想的。这是一个包含大量组的大表。如果要聚合的类型没有最小/最大值(在本例中为UUID),请给出任何建议。我知道我可以定义一个最小/最大函数。。。但真的希望有一个sample()或first/last来真正获取任何值。