SQL 对结果排序,你想对 EMP
表里的工资值排序,并且允许 Tie。你希望返回如下所示的结果集。
SQL 对结果排序 问题描述
你想对 EMP
表里的工资值排序,并且允许 Tie。你希望返回如下所示的结果集。
RNK SAL
--- ----------
1 800
2 950
3 1100
4 1250
4 1250
5 1300
6 1500
7 1600
8 2450
9 2850
10 2975
11 3000
11 3000
12 5000
SQL 对结果排序 解决方案
窗口函数使得排序操作变得极其简单、方便。有 3 种窗口函数对于排序非常有用:DENSE_RANK OVER
、ROW_NUMBER OVER
和 RANK OVER
。
DB2、Oracle 和 SQL Server
因为允许 Tie,所以这里选择了窗口函数 DENSE_RANK OVER
。
1 select dense_rank() over(order by sal) rnk, sal
2 from emp
MySQL 和 PostgreSQL
因为不支持窗口函数功能,我们应该用标量子查询来对工资排序。
1 select (select count(distinct b.sal)
2 from emp b
3 where b.sal <= a.sal) as rnk,
4 a.sal
5 from emp a
SQL 对结果排序 扩展知识
DB2、Oracle 和 SQL Server
窗口函数 DENSE_RANK OVER
完成了大部分工作。OVER
关键字后面的括号里要放一个 ORDER BY
子句以指定用于排序的列。本解决方案使用的是 ORDER BY SAL
,因此 EMP
表是按照工资递增的顺序来排序的。
MySQL 和 PostgreSQL
标量子查询的输出结果类似于 DENSE_RANK
函数,因为标量子查询是基于 SAL
展开迭代计算处理的。