news 2026/5/1 6:24:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01
10004725272001-12-019999-01-01

对所有员工的薪水按照salary降序先进行1-N的排名,如果salary相同,再按照emp_no升序排列:

emp_nosalaryt_rank
10001889581
10002725272
10004725272
10003433113

这个 SQL 中的两个ORDER BY其实目的不同,不是冗余,而是分别服务于两个不同的阶段:


1. 你写的 SQL

sql

SELECT 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. 示例验证

数据:

text

10001 88958 10002 72527 10004 72527 10003 43311
  • 窗口函数DENSE_RANK()已经正确计算排名:

    • 88958 → 1

    • 72527 → 2

    • 43311 → 3

  • 如果没有最后ORDER BY salary DESC, emp_no
    可能输出:

    text

    10001 88958 1 10004 72527 2 ← emp_no 大的反而在前 10002 72527 2 10003 43311 3
  • 加上最后的ORDER BY salary DESC, emp_no

    text

    10001 88958 1 10002 72527 2 ← emp_no 小的在前 10004 72527 2 10003 43311 3

4. 总结

位置作用
OVER (ORDER BY salary DESC)决定排名的数值(1,2,3...)
末尾ORDER BY salary DESC, emp_no决定最终结果集的显示顺序(满足“同薪按 emp_no 升序”)

两个ORDER BY缺一不可,第一个影响排名逻辑,第二个影响最终输出顺序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:18:42

Swift测试智能代理:从脚本到意图驱动的iOS自动化测试进阶

1. 项目概述:一个面向Swift测试的智能代理技能最近在梳理团队内部的iOS自动化测试流程时,我一直在思考一个问题:如何让测试代码的编写和维护变得更“聪明”?传统的UI测试和单元测试脚本,往往需要测试工程师投入大量精力…

作者头像 李华
网站建设 2026/5/1 6:17:54

你的.NET应用为什么越来越慢?问题从来不在代码

一、问题往往不是出在你以为的地方系统变慢的时候,大多数人的第一反应都很一致:是不是SQL写得不够好,是不是哪里没加缓存,是不是算法可以再优化一下。然后开始改查询、加索引、做缓存,甚至加机器。短时间内可能确实有效…

作者头像 李华
网站建设 2026/5/1 6:15:46

ESP32 RGB LED开发板对比与应用指南

1. 两款ESP32 RGB LED开发板深度解析最近在Banggood上出现了两款非常有趣的微型开发板——C3FH4 RGB和PICO D4 RGB。这两块板子都采用了55的RGB LED矩阵设计,但核心处理器有所不同。作为一名长期玩转物联网设备的开发者,我觉得有必要为大家详细剖析这两款…

作者头像 李华
网站建设 2026/5/1 6:07:32

有效的括号

1.栈的经典应用&#xff0c;建议先去了解栈的基础题目链接&#xff1a;https://leetcode.cn/problems/valid-parentheses/视频讲解&#xff1a;https://www.bilibili.com/video/BV1AF411w78g2.代码class Solution { public:bool isValid(string s) {unordered_map<char, ch…

作者头像 李华
网站建设 2026/5/1 6:04:50

算法训练第十八天|20. 有效的括号

1.视频链接&#xff1a;https://www.bilibili.com/video/BV1AF411w78g 2.题目链接&#xff1a;https://leetcode.cn/problems/valid-parentheses/ 3.遇到问题&#xff1a; 边界条件遗漏&#xff1a;容易忘记判断“栈空时遇到右括号”&#xff08;如 ")"&#xff09…

作者头像 李华