如何在窗口上模拟array_agg(distinct x)?

时间:2015-11-02 18:35:47

标签: sql postgresql window-functions

我有一个使用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子句本身。我如何解决这个限制?

1 个答案:

答案 0 :(得分:1)

我决定使用此anyarray_uniq中提供的函数GitHub Repo。我将初始选择包装在另一个select中,应用anyarray_uniq并按原样重复使用所有其他列。因为这完全符合我的要求,幸运的是,在这种情况下我不需要考虑性能。