SQL去重查询:应使用DISTINCT、窗口函数还是GROUP BY?
单字段去重的SQL方案对比
针对你从unitactuals.unitserials表中获取去重item_id的需求,直接说结论:现有用DISTINCT的写法已经很简便,下面给你分析三种方案的适用场景:
1. 现有DISTINCT写法
你的当前语句完全没问题,单字段去重用SELECT DISTINCT语法最直观,数据库优化器能高效处理这种场景,不需要额外折腾。
2. GROUP BY替代方案
也可以用GROUP BY实现相同效果,写法如下:
select itemid item_id from unitactuals.unitserials where mfgdate > $begin_date_range and mfgdate < $end_date_range and siteid = $site_id and serial like ($serial_prefix || '%') group by itemid
性能上和DISTINCT几乎没差别,优化器会生成类似的执行计划。如果之后你需要对每个item_id做聚合统计(比如计数、求和),GROUP BY会更灵活;但单纯去重的话,两种写法任选其一就行,看你习惯。
3. 窗口函数完全没必要
窗口函数(比如ROW_NUMBER()这类)是用来处理复杂分组排序、行级计算的,用它来做单纯的单字段去重纯属画蛇添足,会让语句变复杂,还可能带来不必要的性能损耗,完全不推荐。
最终建议
单纯单字段去重,DISTINCT和GROUP BY都是正确且简便的方案,你现在的DISTINCT写法已经足够好,不用改。窗口函数就别考虑了,完全不适合这个场景。
内容的提问来源于stack exchange,提问作者sql_newb
相关产品推荐
相关产品推荐

