【MySQL窗口函数】— 4种窗口函数详解(非聚合窗口函数、聚合窗口函数、命名窗口函数、动态窗口函数)

大家好,我是摇光~

本文主要讲解 4种窗口函数(非聚合窗口函数、聚合窗口函数、窗口函数的重命名、动态窗口函数),为了让大家都懂得,我尽量用通俗易懂的讲法讲给大家。


零、前言

一、非聚合窗口函数

非聚合函数有以下函数(注:我只列举了常用的。)

看不明白没关系,我下面会一一对这些进行讲解。

在这里插入图片描述

1、排序函数

  • 先举个例子:

比如现在有一张公司各部门的工资表,如果你想知道每个部门中工资最高的人,那么就可以用ROW_NUMBER()、RANK()、DENSE_RANK()函数进行计算。

排序函数作用就是: 在一个区间内(比如将部门分类,一个部门为一个区间),再进行排序(就可以对工资从大到小进行排序),返回排序的序号;那么序号为 1 的就是各个部门中工资最高的人。

如果区间内不存在重复值,计算结果就会一致。,如果有重复值,三个的结果不一样。

  • ROW_NUMBER(): 不考虑重复值,会给两个相同值分配不同的编号。
  • RANK(): 重复值会生成相同的编号,不过重复值的下一项编号和重复值编号不连续
  • DENSE_RANK(): 重复值会生成相同的编号,不过重复值的下一项编号和重复值编号连续

实际案例

  • 现有数据:
employee_id | name  | department | salary
------------|-------|------------|-------
1           | Alice | HR         | 60000
2           | Bob   | HR         | 60000
3           | Carol | HR         | 50000
4           | Dave  | IT         | 80000
5           | Eve   | IT         | 75000
6           | Frank | IT         | 75000
  • SQL语句:
SELECT
    employee_id,	-- 员工id
    name,			-- 员工名字
    department,		-- 员工所属部门
    salary,			-- 员工工资
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
    DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank
FROM
    employees;
  • 解析 SQL:

ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num

  • ROW_NUMBER() OVER ():是固定写法
  • 在OVER()里面的PARTITION BY department:是针对部门进行分区,一个部门一个区间
  • 在OVER()里面的ORDER BY salary DESC:是对每个分区内的数据进行从大到小排序
  • AS row_num:别名(row_num)
  • 结果展示:
employee_id | name  | department | salary | row_num | rank | dense_rank
------------|-------|------------|--------|---------|------|----------
1           | Alice | HR         | 60000  | 1       | 1    | 1
2           | Bob   | HR         | 60000  | 2       | 1    | 1
3           | Carol | HR         | 50000  | 3       | 3    | 2
4           | Dave  | IT         | 80000  | 1       | 1    | 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值