pgsql中分组保留distinct target值且避免qz.M类行重复的实现方法
实现方案
你可以将数据拆为两类分别处理后合并,即可得到期望结果:
- 非
qz.M前缀的print_name:直接保留所有去重后的原始记录 qz.M前缀的print_name:对print_name和对应target分别去重后排序,按行号一一匹配,保证每个target仅对应一个M前缀的print_name
可用SQL语句
WITH non_m_data AS ( -- 处理非qz.M前缀的记录,直接去重保留 SELECT DISTINCT print_name, target FROM your_table -- 替换为你实际的表名 WHERE print_name NOT LIKE 'qz.M%' ), m_print_names AS ( -- 提取所有qz.M前缀的print_name,去重后排序生成行号 SELECT DISTINCT print_name, ROW_NUMBER() OVER (ORDER BY print_name) AS rn FROM your_table WHERE print_name LIKE 'qz.M%' ), m_targets AS ( -- 提取所有qz.M前缀对应的target,去重后排序生成行号 SELECT DISTINCT target, ROW_NUMBER() OVER (ORDER BY target DESC) AS rn -- 此处降序排序刚好匹配你示例的M1对应q2zA、M2对应q1zA的效果,可根据实际需求调整排序规则 FROM your_table WHERE print_name LIKE 'qz.M%' ) -- 合并两类结果 SELECT print_name, target FROM non_m_data UNION ALL SELECT mp.print_name, mt.target FROM m_print_names mp JOIN m_targets mt ON mp.rn = mt.rn ORDER BY print_name;
执行上述语句得到的结果和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

