如何从窗口框架中排除当前行的对等行?

时间:2018-04-27 04:50:42

标签: sql postgresql

模式

create table items(id integer, number integer);
insert into items values
  (1, 1),
  (2, 1),
  (3, 2),
  (4, 2),
  (5, 3);

查询

select id, string_agg(id::text, ',') over (order by number)
from items;

以上查询产生以下内容:

id | string_agg
---+-----------
1  | 1,2
2  | 1,2
3  | 1,2,3,4
4  | 1,2,3,4
5  | 1,2,3,4,5

但是我不希望窗口框架包含当前行的任何对等行,即:

id | string_agg
---+-----------
1  | 
2  | 
3  | 1,2
4  | 1,2
5  | 1,2,3,4

我需要类似的东西:

range between unbounded preceding and (first peer row - 1)

这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

我可以想出不同的方法来解决这个问题:

  • 使用数组并进行一些数组操作。
  • 计算值,然后分别加入最终结果。
  • 奇怪的数据操作。

这是第三种选择。它生成列表,然后删除当前“组”的值:

select id,
       trim(replace(string_agg(id::text, ',') over (order by number),
                    string_agg(id::text, ',') over (partition by number),
                    ''
                   ), ','
           )
from items i;

这做出以下两个假设:

  • ids是独一无二的。
  • 唯一重复的数字是彼此相邻的数字。

Here是rextester。