首页 > 数据库 >mysql 窗口函数(Window Functions)

mysql 窗口函数(Window Functions)

时间:2023-04-06 16:23:58浏览次数:53  
标签:Functions 窗口 函数 PARTITION RANK Window mysql id name

MySQL 窗口函数(Window Functions)是一种高级的 SQL 查询技巧,它允许在结果集的一组相关行上执行计算。窗口函数可以用于处理分组、排序、累计等复杂的聚合任务,使得查询更加简洁和高效。在 MySQL 8.0 及更高版本中,支持窗口函数。

以下是一些常用的窗口函数:

  1. ROW_NUMBER():为结果集中的每一行分配一个唯一的整数序号。
  2. RANK():为结果集中的每一行分配一个唯一的整数序号,但在具有相同值的行中使用相同的序号。在下一个序号时,会跳过重复的序号。
  3. DENSE_RANK():与 RANK() 类似,但不会跳过重复的序号。
  4. NTILE(N):将结果集分成 N 个组,并为每一行分配一个组号。
  5. CUME_DIST():计算当前行在结果集中的累计分布。
  6. PERCENT_RANK():计算当前行在结果集中的百分比排名。
  7. LEAD():获取当前行后面的第 N 行的值。
  8. LAG():获取当前行前面的第 N 行的值。
  9. FIRST_VALUE():获取窗口中的第一行的值。
  10. LAST_VALUE():获取窗口中的最后一行的值。
  11. NTH_VALUE():获取窗口中的第 N 行的值。

使用窗口函数时,需要定义一个窗口(OVER 子句),它描述了如何为每一行定义相关的行集。窗口定义通常包括以下部分:

  1. PARTITION BY:按给定的列或表达式对结果集进行分区。每个分区将被视为一个独立的窗口,窗口函数会在每个分区上分别计算。
  2. ORDER BY:定义窗口内行的排序顺序。
  3. ROWS/RANGE:定义窗口的大小和形状。ROWS 基于行数,RANGE 基于值范围。

PARTITION BY

PARTITION BY 在窗口函数中的作用类似于分组。它用于将结果集划分为多个分区,以便在每个分区内单独进行窗口函数的计算。通过使用 PARTITION BY 子句,您可以在每个分区内独立地应用窗口函数,而不是在整个结果集中应用。

在很多情况下,PARTITION BY 子句非常有用。例如,当您需要对每个部门的员工进行排名时,可以使用 PARTITION BY 根据部门对员工进行分组,然后在每个部门内应用窗口函数(如 RANK()ROW_NUMBER())。

下面是一个使用 PARTITION BY 的示例:

准备数据

-- 创建 employees 表
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
salary DECIMAL(10, 2) NOT NULL,
department_id INT NOT NULL
);

-- 插入示例数据
INSERT INTO employees (first_name, last_name, salary, department_id) VALUES
('John', 'Doe', 5000.00, 1),
('Jane', 'Smith', 5500.00, 1),
('Mike', 'Brown', 6000.00, 2),
('Emily', 'Johnson', 6500.00, 2),
('Tom', 'Davis', 7000.00, 3),
('Nina', 'Taylor', 5500.00, 3),
('Sophia', 'Lee', 6000.00, 4),
('Daniel', 'Miller', 5800.00, 4);

-- 查询刚刚插入的数据
SELECT * FROM employees;

示例

SELECT 
    department_id, 
    first_name, 
    last_name, 
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_within_department
FROM employees;

在这个示例中,我们使用 RANK()函数为每个部门的员工分配工资排名。通过在窗口定义中包含 PARTITION BY department_id子句,我们确保了在每个部门内部进行排名计算。

标签:Functions,窗口,函数,PARTITION,RANK,Window,mysql,id,name
From: https://www.cnblogs.com/vincent2023/p/17293144.html

相关文章

  • Linux下安装MySQL
    0准备工作yum换源:https://www.cnblogs.com/lgjb/p/17293111.html1下载yumRepositorywget-i-chttp://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2安装yumRepositoryyum-yinstallmysql57-community-release-el7-10.noarch.rpm3安装mysql5.......
  • MySQL重复数据
    插入的数据中A,B,E存在重复数据,C没有重复记录123456789101112131415161718192021CREATETABLE`tab`(  `id`int(11)NOTNULLAUTO_INCREMENT,  `name`varchar(20)DEFAULTNULL,  PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREME......
  • 通过python控制windows窗口的关闭和显示
    代码:importwin32gui,win32con,win32apiimportos,sys,reimportctypesimporttimedefshowWindow(hwnd):#展示窗口,以下几行代码都可以唤醒窗口win32gui.ShowWindow(hwnd,win32con.SW_SHOW)win32gui.ShowWindow(hwnd,win32con.SW_SHOWNA)win32gu......
  • 深入理解MySQL索引底层数据结构
    1引言在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQ......
  • Mac | HomeBrew 安装 & 配置 MySQL
    这个是我最新并且一直推崇的方法:1、安装:brewinstallmysql2、开启mysql:mysql.serverstart3、使用mysql的配置脚本:/usr/local/opt/mysql/bin/mysql_secure_installation//mysql提供的配置向导启动这个脚本后,即可根据如下命令提示进行初始化设置14:14:49withkoshkaaaain......
  • 面试突击MySQL:高并发情况下,数据库该如何设计?
    转载:http://blog.itpub.net/70000181/viewspace-2776766/面试题剖析为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。我先给大家抛出来一个场景:假如我们现在是一个小创业公......
  • canal 同步mysql到rocketMQ
    https://github.com/alibaba/canal/wiki/canal介绍https://github.com/alibaba/canal/releases地址:Mysql172.31.100.133066rocketMQhttp://172.31.100.1:8181Canal-adminhttp://172.31.100.2:8089/admin123456一、Mysql5.7配置(1)###拉取镜像mysql5.7dockerp......
  • 书评《MySQL必知必会》
    对数据库基本无了解的我,打算了解一下数据库/SQL的功能操作,于是想选一本讲数据库操作的书,看到网络上最推荐的书籍就是——《SQL必知必会》和《MySQL必知必会》。这两本书有什么区别?《SQL必知必会》只讲SQL,《MySQL必知必会》除了讲SQL,还针对MySQL讲了一些知识。考虑到《MySQL必知必会......
  • 无备份情况下恢复MySQL truncate table
    近期陆续有客户遇到MySQL的数据库问题,最近正好开始研究MySQL的一些技术。大家都知道我之前是擅长Oracle恢复,如果不会MySQL数据库恢复,总感觉却少一点什么。既然如此,就顺道研究一下吧。幸运的是,Google能够发现一些针对MySQL的恢复文章以及一些工具。我们都知道,MySQLServer都很多存......
  • MySQL中的行转列和列转行
    参考:[MySQL中的行转列和列转行-墨天轮](https://www.modb.pro/db/74028)行转列与列转行的概念什么是行转列什么是列转行行转列实验示例示例一:使用聚合函数示例二:使用group_concat函数示例三:使用动态SQL语句块列转行实验示例示例一:使用unionall......