如何基于聚合生成的new_field字段去除重复查询结果?
问题分析与解决
你的核心问题是GROUP BY的逻辑和需求完全不匹配:你想基于new_field(即fieldA+fieldB的组合)去重,但当前SQL是按field c和field d分组,这根本不是你要的去重维度,所以自然得不到正确结果。
正确方案分两种场景:
场景1:只保留new_field唯一的行,field c/field d取任意值
用窗口函数ROW_NUMBER()对new_field分区,取每个分区的第一行即可:
SELECT new_field, field_c, field_d FROM ( SELECT CONCAT(fieldA, '_', fieldB) AS new_field, field_c, field_d, -- 按new_field分组编号,ORDER BY选NULL表示取任意行,可替换成你需要的排序规则(比如按id取最新行) ROW_NUMBER() OVER (PARTITION BY CONCAT(fieldA, '_', fieldB) ORDER BY (SELECT NULL)) AS rn FROM tableA WHERE field = 'false' AND fieldy = 'true' ) t WHERE rn = 1;
场景2:需要对field c/field d做聚合(比如取最小/最大值)
直接按fieldA和fieldB分组(等价于按new_field分组,且比分组拼接后的字符串更高效),再对field c/field d用聚合函数:
SELECT CONCAT(fieldA, '_', fieldB) AS new_field, MIN(field_c) AS field_c, -- 可替换成MAX/AVG等,根据你的需求选择 MIN(field_d) AS field_d FROM tableA WHERE field = 'false' AND fieldy = 'true' GROUP BY fieldA, fieldB; -- 用原始字段分组比GROUP BY new_field性能更好,避免字符串计算开销
为什么原来的SQL不对?
你写的GROUP BY 2,3是按SELECT列表中第2、3个字段(即field c和field d)分组,这会把field c和field d完全相同的行聚合到一起,和你要的基于fieldA+fieldB组合去重没有任何关系,所以结果肯定不符合预期。
内容的提问来源于stack exchange,提问作者Armine
相关产品推荐
相关产品推荐

