PostgreSQL:基于tag列筛选name唯一值的实现方案
解决方案
问题出在你的过滤逻辑会同时匹配tag='cep'和分区内第一条数据,当cep不是分区第一条时,就会产生重复记录。正确的做法是在排序阶段为cep设置最高优先级,确保每个name仅返回一条符合规则的数据:
SELECT name, tag FROM ( SELECT name, tag, row_number() OVER ( PARTITION BY name ORDER BY CASE WHEN tag = 'cep' THEN 0 ELSE 1 END, tag -- 非cep场景可替换为随机函数 ) AS rn FROM your_table -- 替换为实际表名 ) AS sub_query WHERE rn = 1;
逻辑说明
- 用
CASE WHEN tag = 'cep' THEN 0 ELSE 1 END作为排序首条件,让cep标签的记录排在每个name分组的最前列 - 第二个排序条件可按需调整:
- 若需随机选取非
cep的标签,可替换为对应数据库的随机函数(如MySQL用RAND(),PostgreSQL用random()) - 若需固定选取某一规则的标签(如字典序),保留
tag即可
- 若需随机选取非
- 最后通过
WHERE rn = 1过滤,每个name仅返回一条数据,优先选取cep标签,无cep时按排序规则选取任意一个标签
内容的提问来源于stack exchange,提问作者Giacomo F
相关产品推荐
相关产品推荐

