You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PSQL分组后如何过滤每个分组内的冗余元素

实现方案

方案1:先获取全部分组再左关联过滤后的数据

完全符合「先定位全部分组,再过滤分组内冗余行」的逻辑,不会丢失任何group_idx分组:

WITH all_groups AS (
    -- 第一步先提取所有存在的分组,保证无遗漏
    SELECT group_idx FROM nexp GROUP BY group_idx
)
SELECT t.* 
FROM all_groups g
LEFT JOIN nexp t 
    ON g.group_idx = t.group_idx 
    AND t.filter_idx <> 'z'; -- 过滤逻辑放在关联条件中,不影响分组保留

如果某个分组下全部都是filter_idx = 'z'的行,返回结果里该分组对应的其他字段会显示为NULL,确保分组不会丢失。

方案2:窗口函数实现

如果不需要保留全空的分组行,仅需保证所有存在有效数据的分组都不丢失,可以用窗口函数实现:

SELECT id, group_idx, filter_idx
FROM (
    SELECT 
        *,
        COUNT(*) OVER (PARTITION BY group_idx) AS group_total
    FROM nexp
) t
WHERE filter_idx <> 'z' AND group_total > 0;

结果验证

针对你提供的样例数据,两种方案返回的有效数据行均为:

id | group_idx | filter_idx
---+-----------+-----------
1  | 1         | x
3  | 3         | x
4  | 2         | x
5  | 1         | x
6  | 3         | x
7  | 2         | x

所有3个group_idx(1、2、3)都完整保留,无分组丢失。

内容的提问来源于stack exchange,提问作者Andriy Van Dam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:03