窗口函数

mysql常见的窗口函数:


rank()、dense_rank()、row_number()的区别
rank():如果有并列名次的行,会占用下一名次的位置。(比如三个人分数都是最高,那三个人并列第一,下一个人第四)
dense_rank():如果有并列名次的行,不占用下一名次的位置。(比如三个人分数都是最高,那三个人并列第一,下一个人第二)
row_number():不考虑并列名次的情况(比如三个人相同名次直接第一第二第三名)

  • 其中,DENSE_RANK() 函数的语法如下:
DENSE_RANK() OVER (
    PARTITION BY [{,...}]
    ORDER BY  [ASC|DESC], [{,...}]
)
//在这个语法中:
//首先,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;

你可能感兴趣的:(窗口函数)