sql - 如何从窗口框架中排除当前行的对等行?
问题描述
架构
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)
这甚至可能吗?
解决方案
我可以想出不同的方法来解决这个问题:
- 使用数组并进行一些数组操作。
- 计算值,然后分别加入最终结果。
- 奇怪的数据操作。
这适用于第三个选项。它生成列表,然后删除当前“组”的值:
select id,
trim(replace(string_agg(id::text, ',') over (order by number),
string_agg(id::text, ',') over (partition by number),
''
), ','
)
from items i;
这做出以下两个假设:
- id 是唯一的。
- 唯一重复的数字是彼此相邻的数字。
这是一个重新测试者。
推荐阅读
- api - How to get SMS history with Esendex API?
- java - 关于库的UML类图的问题
- php - 获取(并显示)与 ACF 关系字段匹配的其他帖子
- python - Discord.py 嵌入颜色
- amazon-web-services - 是否有提供 <= 20 毫秒查询延迟的 AWS 服务?
- owl-carousel - 删除猫头鹰轮播中图像前后的空格
- apache-kafka - Kafka - 1 个或多个分区的副本数量超过配置的数量
- apache - .htaccess setEnv as %{HTTP_HOST}
- angular - How to use BehaviourSubjects to share data from API call between components in Angular?
- sql - How to create a unique id for each insert in Oracle