SQL使用Order By排序结果不符合预期,无法定位错误如何排查?
你的查询逻辑不符合排序需求,问题根源如下:
你当前使用GROUP BY to_state, service按「州+服务类型」两个维度分组,输出的每一行统计值是单个州对应单个服务类型的条目数量,ORDER BY 2 DESC是按这个单维度数值降序排列,并非你需要的「单个州所有服务类型的总数值」,因此会出现CO、TX这类总数值高的州排序错乱的问题。
方案1:窗口函数实现(兼容PostgreSQL、MySQL 8.0+、SQL Server等主流新版本数据库)
通过窗口函数直接计算每个州的总统计值作为排序依据:
select to_state, count(to_state) as service_count, service from uscount group by 1, 3 order by sum(count(to_state)) over (partition by to_state) desc, service_count desc limit 10
额外增加的service_count desc次级排序,可让同州的不同服务按数值从高到低排列,堆叠柱形图的展示效果更规整。
方案2:子查询关联实现(兼容所有数据库版本)
如果数据库不支持窗口函数,可先单独统计每个州的总数值,关联后再排序:
select t1.to_state, t1.service_count, t1.service from ( select to_state, count(to_state) as service_count, service from uscount group by 1, 3 ) t1 inner join ( select to_state, count(to_state) as state_total from uscount group by 1 ) t2 on t1.to_state = t2.to_state order by t2.state_total desc, t1.service_count desc limit 10
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

