首页 > 解决方案 > 如何从窗口框架中排除当前行的对等行?

问题描述

架构

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)

这甚至可能吗?

标签: sqlpostgresql

解决方案


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

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

这适用于第三个选项。它生成列表,然后删除当前“组”的值:

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

这做出以下两个假设:

  • id 是唯一的。
  • 唯一重复的数字是彼此相邻的数字。

是一个重新测试者。


推荐阅读