我有一个使用array_agg
作为窗口函数的查询,即带有over (...)
子句。我想在这个数组聚合中只得到一组不同的值,但是这不是Postgres 9.4的实现:
对于以下(简化)查询,
with test_data(day, daytime, song) as (
select 'MON', 'morning', 'A'
union all
select 'MON', 'morning', 'B'
union all
select 'MON', 'afternoon', 'A'
union all
select 'TUE', 'afternoon', 'B'
)
select distinct
day,
first_value(daytime) over w as started,
array_agg(distinct daytime) over w as daytimes,
array_agg(distinct song) over w as songs
from test_data
window w as (partition by day order by daytime ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
Postgres返回以下内容:
SQLERROR [0A00]: ERROR: distinct is not implemented for window functions
我确信我无法避免使用window子句本身。我如何解决这个限制?
答案 0 :(得分:1)
我决定使用此anyarray_uniq
中提供的函数GitHub Repo。我将初始选择包装在另一个select
中,应用anyarray_uniq
并按原样重复使用所有其他列。因为这完全符合我的要求,幸运的是,在这种情况下我不需要考虑性能。