如何在PostgreSQL中按分区(country)复制SQL行并添加标识列
实现方案
你可以通过**交叉连接(CROSS JOIN)**结合存在性判断来实现这个需求,具体步骤和SQL语句如下:
核心思路
- 提取所有唯一的
country值,作为结果中的partition列; - 提取原表中所有
code行(保留重复值,匹配你需求里出现重复A的情况); - 将两者做交叉连接,得到每个国家与所有code的全量组合;
- 通过判断原表中是否存在对应的
(country, code)组合,生成布尔类型的indicator列。
PostgreSQL 查询语句
WITH all_partitions AS ( SELECT DISTINCT country AS partition FROM your_table -- 替换成你的实际表名 ), all_codes AS ( SELECT code FROM your_table ) SELECT ap.partition, ac.code, EXISTS ( SELECT 1 FROM your_table t WHERE t.country = ap.partition AND t.code = ac.code ) AS indicator FROM all_partitions ap CROSS JOIN all_codes ac ORDER BY ap.partition, ac.code;
语句说明
all_partitionsCTE:获取所有唯一的国家,作为每个分区的基础;all_codesCTE:获取原表中全部code记录(保留重复项,确保结果和需求中的code数量、重复情况一致);CROSS JOIN:让每个分区和所有code做全量关联,生成所有可能的组合;EXISTS子查询:检查当前分区国家与code的组合是否存在于原表中,存在则返回True,否则返回False;ORDER BY:保证结果按分区、code排序,和示例输出结构一致(可根据实际需求调整或移除)。
内容的提问来源于stack exchange,提问作者Rodrigo A
相关产品推荐
相关产品推荐

