SQL如何实现同手机号记录聚合后内部按通话日期升序排序
问题原因及解决方案
为什么现有语句达不到效果
- 首先你对
GROUP BY的使用场景理解有误:GROUP BY是用于聚合计算的语法(比如统计每个手机号的通话总次数、最早通话时间等),你的需求只是将同手机号的记录排列到一起,不需要做聚合计算,加GROUP BY PHONENO,CALLDATE在这里的唯一作用是对查询结果去重,和“归集相同手机号”的需求没有关联。 - 相同PHONENO没有归集到一起的核心原因是PHONENO为varchar2字符串类型,排序规则与数字不同:字符串排序会逐位对比字符的ASCII码值,即使你存储的内容都是9位整数,如果字段值存在前导空格、非数字隐形字符,就会出现同数值开头的手机号排序分散的问题。
正确写法
如果不需要对重复的<PHONENO, CALLDATE>记录去重,直接去掉多余的GROUP BY,将PHONENO转为数字类型排序即可:
SELECT PHONENO, CALLDATE FROM TABLE1 ORDER BY CAST(TRIM(PHONENO) AS NUMBER) ASC, CALLDATE ASC
如果确实有去重需求,可以保留GROUP BY,同样按数字类型排序PHONENO:
SELECT PHONENO, CALLDATE FROM TABLE1 GROUP BY PHONENO, CALLDATE ORDER BY CAST(TRIM(PHONENO) AS NUMBER) ASC, CALLDATE ASC
内容的提问来源于stack exchange,提问作者JiMZ
相关产品推荐
相关产品推荐

