MySQL中的窗口函数(Window Functions)是一种用于在查询结果集内执行计算的功能。窗口函数可以在查询中进行分析和聚合操作,而无需将查询结果分组。它们可以用于计算排名、行号、累积值等各种分析操作。窗口函数通常与OVER子句一起使用,用于指定窗口的范围。
常见的窗口函数包括:
ROW_NUMBER(): 分配唯一的整数值给结果集中的每一行,表示行的顺序。
RANK(): 计算每一行的排名,相同值会有相同的排名,但可能有跳过的排名。
DENSE_RANK(): 计算每一行的排名,相同值会有相同的排名,但没有跳过的排名。
NTILE(n): 将结果集划分成n个近似相等的部分,并为每一行分配一个桶号。
SUM(), AVG(), COUNT(), MAX(), MIN(): 计算某一列在窗口范围内的聚合值。
以下是一个示例查询,展示了如何在MySQL中使用窗口函数:
SELECT
employee_id,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM
employees;
在这个查询中,使用了RANK()函数来计算每个员工的薪水排名,按照薪水降序排序。
请注意,窗口函数的使用可能会涉及到不同数据库管理系统的特定语法和支持程度。确保你的MySQL版本支持窗口函数,并在使用时查阅官方文档以获取准确的语法和用法信息。
牛客:
https://www.nowcoder.com/practice/8d2c290cc4e24403b98ca82ce45d04db?tpId=82&tqId=29762&rp=1&ru=%2Fexam%2Foj&qru=%2Fexam%2Foj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D240&difficulty=undefined&judgeStatus=undefined&tags=&title=
#################################################窗口函数测试
# drop table if exists `salaries` ;
# CREATE TABLE `salaries` (
# `emp_no` int(11) NOT NULL,
# `salary` int(11) NOT NULL,
# `from_date` date NOT NULL,
# `to_date` date NOT NULL,
# PRIMARY KEY (`emp_no`,`from_date`));
# INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
# INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
# INSERT INTO salaries VALUES(10004,72527,'2002-08-02','9999-01-01');
# INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
#窗口函数1
# select emp_no,salary,rank() over(order by salary desc) t
# from salaries
# 10001|88958|1
# 10002|72527|2
# 10004|72527|2
# 10003|43311|4
#RANK():计算每一行的排名,相同值会有相同的排名,但可能会跳过排名。
# select emp_no,salary
# from
# (select emp_no,salary,rank() over(order by salary desc) t
# from salaries) a
# where t=2
# 10002|72527
# 10004|72527
#窗口函数2
# select emp_no,salary,row_number() over(order by salary desc) t
# from salaries
# 10001|88958|1
# 10002|72527|2
# 10004|72527|3
# 10003|43311|4
#ROW_NUMBER():为结果集中的每一行分配唯一的整数值,表示行的顺序。
# select emp_no,salary
# from
# (select emp_no,salary,row_number() over(order by salary desc) t
# from salaries) a
# where t=2
# 10002|72527
#窗口函数3
# select emp_no,salary,DENSE_RANK() over(order by salary desc) t
# from salaries
# 10001|88958|1
# 10002|72527|2
# 10004|72527|2
# 10003|43311|3
#DENSE_RANK():计算每一行的排名,相同值会有相同的排名,但不会跳过排名。
# select emp_no,salary
# from
# (select emp_no,salary,DENSE_RANK() over(order by salary desc) t
# from salaries) a
# where t=2
# 10002|72527
# 10004|72527
#窗口函数4
# select emp_no,salary,NTILE(4) over(order by salary desc) t
# from salaries
# 10001|88958|1
# 10002|72527|2
# 10004|72527|3
# 10003|43311|4
#窗口函数5
#SUM(), AVG(), COUNT(), MAX(), MIN(): 在窗口范围内计算某一列的聚合值。
select emp_no,salary,SUM(salary) over(PARTITION BY emp_no) t
from salaries
chatgpt:
NTILE的使用
上面是表结构信息
SUM,等函数的使用。
上面是表结构信息
增加内容:
(不明白的小伙伴可以看看:
row_number(): 同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
rank(): 同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
dense_rank(): 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3
ntile(): 分桶排名,即首先按桶的个数分出第一二三桶,然后各桶内从1排名,实际不是很常用
partition by,按某字段切分
order by,与常规order by用法一致,也区分ASC(默认)和DESC,因为排名总得有个依据
作者:luanhz
链接:https://leetcode-cn.com/problems/nth-highest-salary/solution/mysql-zi-ding-yi-bian-liang-by-luanz/
)