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 展开迭代计算处理的。
极客教程