在PgAdmin的PostgreSQL中从两表取去重值且避免全组合
实现方法
要实现表1去重后的Column B与表2去重后的Column C按行一一对应,核心思路是给两个去重后的数据集分别添加行号,再通过行号关联,避免笛卡尔积。具体操作如下:
核心逻辑拆解
- 先对两张表的目标字段做去重处理,同时用
row_number()窗口函数生成连续行号,行号是后续关联的关键 - 基于行号将两个结果集做关联,就能得到一一对应的结果,而非全量组合
完整SQL示例
假设你的表名分别为table1和table2,目标字段为B和C:
WITH distinct_b AS ( SELECT DISTINCT B, row_number() OVER (ORDER BY B) AS rn FROM table1 ), distinct_c AS ( SELECT DISTINCT C, row_number() OVER (ORDER BY C) AS rn FROM table2 ) SELECT db.B, dc.C FROM distinct_b db JOIN distinct_c dc ON db.rn = dc.rn;
关键细节说明
ORDER BY B和ORDER BY C是为了保证行号生成顺序稳定,如果你需要自定义对应规则(比如按数据插入时间排序),直接修改ORDER BY后的字段即可- 如果两个去重后的数据集行数不一致,
JOIN会只返回行数较少的那部分对应结果;若要保留所有行(行数多的一侧补空值),可以把JOIN替换成FULL OUTER JOIN
内容的提问来源于stack exchange,提问作者G Nisan
相关产品推荐
相关产品推荐

