尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SQL示例:为什么同样的条件需要重复两次排序

SQL示例:为什么同样的条件需要重复两次排序 SQL查询中两个ORDER BY子句作用不同不是冗余。第一个在窗口函数内DENSE_RANK() OVER(ORDER BY salary DESC)决定排名规则第二个在语句末尾ORDER BY salary DESC,emp_no控制结果输出顺序。示例显示若不使用第二个ORDER BY相同工资的员工可能不按emp_no升序排列。两个ORDER BY分别服务于排名计算和结果排序两个不同阶段确保既正确计算排名又满足最终显示顺序要求。SQL示例为什么同样的条件需要重复两次排序题目描述有一个薪水表salaries简况如下:emp_nosalaryfrom_dateto_date10001889582002-06-229999-01-0110002725272001-08-029999-01-0110003433112001-12-019999-01-0110004725272001-12-019999-01-01对所有员工的薪水按照salary降序先进行1-N的排名如果salary相同再按照emp_no升序排列emp_nosalaryt_rank10001889581100027252721000472527210003433113这个 SQL 中的两个ORDER BY其实目的不同不是冗余而是分别服务于两个不同的阶段1. 你写的 SQLsqlSELECT emp_no, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS t_rank FROM salaries ORDER BY salary DESC, emp_no;第一个ORDER BY在窗口函数内DENSE_RANK() OVER (ORDER BY salary DESC)决定排名规则—— 按工资降序排名。第二个ORDER BY在语句末尾ORDER BY salary DESC, emp_no决定结果集的输出顺序。2. 为什么需要两次题目要求对所有员工的薪水按照 salary 降序先进行 1-N 的排名如果 salary 相同再按照 emp_no 升序排列。这个 “再按照 emp_no 升序排列” 指的是输出结果的顺序而不是排名规则。最终结果需要按工资从高到低排序工资相同的员工按emp_no升序如果不写最后的ORDER BY salary DESC, emp_no结果集会按窗口函数的分区/排序顺序输出但在某些数据库中可能是不确定的顺序比如按物理存储顺序。对于工资相同的员工例如 72527可能输出顺序是10004在前、10002在后不符合“emp_no 升序”的要求。3. 示例验证数据text10001 88958 10002 72527 10004 72527 10003 43311窗口函数DENSE_RANK()已经正确计算排名88958 → 172527 → 243311 → 3如果没有最后ORDER BY salary DESC, emp_no可能输出text10001 88958 1 10004 72527 2 ← emp_no 大的反而在前 10002 72527 2 10003 43311 3加上最后的ORDER BY salary DESC, emp_notext10001 88958 1 10002 72527 2 ← emp_no 小的在前 10004 72527 2 10003 43311 34. 总结位置作用OVER (ORDER BY salary DESC)决定排名的数值1,2,3...末尾ORDER BY salary DESC, emp_no决定最终结果集的显示顺序满足“同薪按 emp_no 升序”两个ORDER BY缺一不可第一个影响排名逻辑第二个影响最终输出顺序。
返回列表