SQL 提取最靠前的n行记录,你想基于某种排序方式从结果集中提取出限定数目的记录。例如,你希望返回 5 个工资最高的员工的姓名和工资。
SQL 提取最靠前的n行记录 问题描述
你想基于某种排序方式从结果集中提取出限定数目的记录。例如,你希望返回 5 个工资最高的员工的姓名和工资。
SQL 提取最靠前的n行记录 解决方案
本解决方案的关键之处有两点:首先要基于我们感兴趣的列对数据集进行排序,然后从结果集里提取出所需数目的行记录。
DB2、Oracle 和 SQL Server
本解决方案需要用到窗口函数。使用哪个窗口函数取决于我们希望如何处理 Tie1。下面的解决方案选择了 DENSE_RANK
函数,这意味着每一个 Tie 只会被计数一次。
上述查询返回的行数可能超过 5,但只有 5 种不同的工资值。如果你希望不考虑 Tie,只返回 5 行记录的话,那就使用 ROW_NUMBER OVER
(因为该函数不关心 Tie)。
MySQL 和 PostgreSQL
使用标量子查询为每个工资值创建一个序号,然后通过上述序号限制子查询的结果行数。
SQL 提取最靠前的n行记录 扩展知识
DB2、Oracle 和 SQL Server
内嵌视图 X
里的窗口函数 DENSE_RANK OVER
完成了全部工作,执行该函数后得到的结果如下所示。
最后,我们只需要返回 DR
小于或等于 5 的行即可。
MySQL 和 PostgreSQL
内嵌视图 X
里的标量子查询为工资值编排序号,结果如下。
最后,返回 RNK
小于或等于 5 的那些行即可。
1此处 Tie 意为“平手、平局”。本书保持不译。在排序计算的过程中,如果一个名次上出现了多个候选项,则每一个候选项均可称之为“一个 Tie”。有的数据库函数的计算结果中允许出现多个 Tie,有的则仅返回一个。——译者注