mysql常见的窗口函数:
rank()、dense_rank()、row_number()的区别
rank():如果有并列名次的行,会占用下一名次的位置。(比如三个人分数都是最高,那三个人并列第一,下一个人第四)
dense_rank():如果有并列名次的行,不占用下一名次的位置。(比如三个人分数都是最高,那三个人并列第一,下一个人第二)
row_number():不考虑并列名次的情况(比如三个人相同名次直接第一第二第三名)
- 其中,DENSE_RANK() 函数的语法如下:
DENSE_RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
//在这个语法中:
//首先,PARTITION BY子句将FROM子句生成的结果集划分为分区。DENSE_RANK()函数应用于每个分区。
其次,ORDER BY 子句指定DENSE_RANK()函数操作的每个分区中的行顺序。
例题:
题解:
SELECT t.dept_no,t.emp_no,t.salary AS maxSalary
FROM (SELECT d.dept_no,d.emp_no,s.salary,
DENSE_RANK() OVER (PARTITION BY d.dept_no ORDER BY s.salary DESC) AS sal_rank
FROM dept_emp d
INNER JOIN salaries s
ON d.emp_no = s.emp_no) t
WHERE t.sal_rank = 1
ORDER BY t.dept_no;