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;