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

Sql 如何从窗口框架中排除当前行的对等行?,sql,postgresql,Sql,Postgresql,模式 创建表项(id整数、number整数); 在项目中插入值 (1, 1), (2, 1), (3, 2), (4, 2), (5, 3); 查询 select id,string_agg(id::text,,')over(按编号排序) 从项目; 上述查询产生以下结果: 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整数、number整数);
在项目中插入值
(1, 1),
(2, 1),
(3, 2),
(4, 2),
(5, 3);
查询

select id,string_agg(id::text,,')over(按编号排序)
从项目;
上述查询产生以下结果:

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)

这可能吗?

我可以想出不同的方法来实现这一点:

  • 使用数组并执行一些数组操作
  • 计算这些值,然后分别将最终结果加入
  • 奇怪的数据操纵
这适用于第三种选择。它生成列表,然后删除当前“组”的值:

这就产生了以下两个假设:

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

是一名测试员。

我不完全理解你的逻辑。您能否清楚地解释预期输出背后的逻辑?默认窗口框架的框架结尾为
当前行
。根据,
frame\u当前行的结束表示帧以对等方的最后一个等价顺序结束
,但我希望它是
帧以对等方的第一个等价顺序之前的行结束
。我希望窗口框架仅包括
number
小于当前行
number
的行。
select id,
       trim(replace(string_agg(id::text, ',') over (order by number),
                    string_agg(id::text, ',') over (partition by number),
                    ''
                   ), ','
           )
from items i;