SQL中常用的排序算法
介绍SQL在分析查询中的排序。

DENSE_RANK()是一种高级SQL窗口函数,可为结果集中的每个不同值生成一个排名,同时考虑并确保后续值获得连续的排名。

DENSE_RANK()与RANK()或ROW_NUMBER()等其他排序函数不同,DENSE_RANK()将具有相同值的行分配相同的排名,然后通过共享相同值的行数递增排序。
一般的语法如下:
DENSE_RANK() OVER (ORDER BY column)
DENSE_RANK() OVER (PARTITION BY column ORDER BY column)
让我们通过一些实际的代码示例来说明DENSE_RANK()函数的强大功能:
-- 首先,让我们创建一个名为employees的表:
CREATE TABLE employees (
id integer,
first_name varchar(20),
last_name varchar(20),
position varchar(20),
salary varchar(20)
);
-- 让我们向表employees中添加一些值:
INSERT INTO employees VALUES
(1, 'James', 'Flynn', 'Manager', 62000),
(2, 'Ajay', 'Ramoray', 'Manager', 62000),
(3, 'Ayse', 'Berry', 'Senior Manager', 98000),
(4, 'Gail', 'Edward', 'Associate', 50000),
(5, 'Maria', 'Frey', 'Senior Associate', 82000),
(6, 'Daniel', 'Lordman', 'Associate', 73000),
(7, 'Ferehsteh', 'Asmus', 'Senior Associate', 92000),
(8, 'Kalpana', 'Kumar', 'Manager', 86000),
(9, 'Peter', 'Ashley', 'Associate', 73000),
(10, 'Joanna', 'White', 'Senior Associate', 54000),
(11, 'Drake', 'Valley', 'Senior Associate', 54000);
-- 下面是我们的employees表的样子
SELECT *
FROM employees;

SELECT * , DENSE_RANK() OVER(ORDER BY salary DESC) AS employee_rank
FROM employees;

SELECT * , DENSE_RANK() OVER(ORDER BY salary) AS employee_rank
FROM employees;

SELECT * , DENSE_RANK() OVER(PARTITION BY position ORDER BY salary DESC) AS employee_rank
FROM employees;

当你想要将具有相同排名的项目分组在一起时,DENSE_RANK()非常有用。
SELECT title, price, DENSE_RANK() OVER(ORDER BY price DESC) as 'rank'
FROM titles;

SELECT title, price, type, DENSE_RANK() OVER(PARTITION BY type ORDER BY price DESC) as 'rank'
FROM titles;

SELECT title, ytd_sales, DENSE_RANK() OVER(ORDER BY ytd_sales DESC) as 'rank'
FROM titles;

SELECT title, ytd_sales, type, DENSE_RANK() OVER(PARTITION BY type ORDER BY ytd_sales DESC) as 'rank'
FROM titles;

SQL中的DENSE_RANK()窗口函数功能非常强大,可在考虑相同值的情况下在结果集中进行排序和分组。无论是需要创建排名、将具有相同值的项目进行分组,还是需要识别表现最佳的项目,DENSE_RANK()都是首选函数。