MySQL 8.0开始引入了开窗函数,使得SQL语句能够以更复杂的方式操作数据集。

在MySQL中使用`ROW_NUMBER()`函数时,可以通过一个简单的图表来帮助理解它是如何工作的。以下是对`ROW_NUMBER()`函数的图解说明:

假设我们有一个名为`employees`的表,其中包含以下列:`employee_id`(员工ID),`first_name`(名),`last_name`(姓),和`hire_date`(入职日期)。表中的数据如下:

| employee_id | first_name | last_name | hire_date   |
|-------------|------------|-----------|--------------|
| 1           | John       | Doe      | 2018-06-01   |
| 2           | Jane       | Smith    | 2018-06-02   |
| 3           | Bob        | Johnson  | 2018-06-01   |
| 4           | Alice      | Davis    | 2018-06-03   |
| 5           | Mike       | Brown    | 2018-06-04   |

现在我们使用`ROW_NUMBER()`函数来为每个员工基于`hire_date`字段分配一个序号:

```sql
SELECT 
  employee_id,
  first_name,
  last_name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS row_num
FROM 
  employees;
```

执行上述查询后,结果集可能会如下所示:

| employee_id | first_name | last_name | hire_date   | row_num |
|-------------|------------|-----------|--------------|---------|
| 1           | John       | Doe      | 2018-06-01   | 1       |
| 3           | Bob        | Johnson  | 2018-06-01   | 1       |
| 2           | Jane       | Smith    | 2018-06-02   | 2       |
| 4           | Alice      | Davis    | 2018-06-03   | 3       |
| 5           | Mike       | Brown    | 2018-06-04   | 4       |

**图解**:

1. 首先,`ROW_NUMBER()`函数在结果集上应用,根据`hire_date`字段对员工进行排序。
2. 然后,它为排序后的结果集中的每一行分配一个唯一的序号,序号从1开始。
3. 如果有多个员工在同一个日期入职(如员工1和员工3),`ROW_NUMBER()`仍然为它们分配连续的序号,而不是跳过。

图表表示可能如下:

```
+-------------+------------+-----------+--------------+--------+
| employee_id | first_name | last_name | hire_date   | row_num|
+-------------+------------+-----------+--------------+--------+
| 1           | John       | Doe      | 2018-06-01   |   1    |
| 3           | Bob        | Johnson  | 2018-06-01   |   1    |
| 2           | Jane       | Smith    | 2018-06-02   |   2    |
| 4           | Alice      | Davis    | 2018-06-03   |   3    |
| 5           | Mike       | Brown    | 2018-06-04   |   4    |
+-------------+------------+-----------+--------------+--------+
   排序依据 ->  ^ 
   序号       ->  1, 1, 2, 3, 4
```

在这个图表中,我们可以看到`ROW_NUMBER()`函数如何基于排序依据(`hire_date`)为每行分配序号。这个序号是连续的,即使有多行具有相同的排序值。

MySQL中的`ROW_NUMBER()`是一个开窗函数,它为结果集中的每一行分配一个唯一的序号(从1开始),这些序号的分配顺序是根据`OVER()`子句中定义的排序规则来确定的。如果存在排序相同的行,`ROW_NUMBER()`会为这些行分配连续的序号,不会跳过任何序号。

### 语法:
```sql
ROW_NUMBER() OVER (
  [PARTITION BY partition_expression, ... ]
  ORDER BY sort_expression [ASC | DESC], ...
)
```

- `PARTITION BY`:可选子句,用于指定一个或多个列,以将数据分成不同的分区。在每个分区内,`ROW_NUMBER()`会独立地为行分配序号。
- `ORDER BY`:必须子句,用于指定排序的列和顺序(升序`ASC`或降序`DESC`)。如果没有指定排序顺序,默认为升序。

### 应用场景:
- 数据去重:当需要从结果集中去除重复行时。
- 分页查询:与`LIMIT`子句结合使用,实现分页效果。
- 行排序:为数据集的行分配一个唯一的序号,以便于排序。

### 示例:

假设有一个名为`employees`的表,包含员工ID(`employee_id`)、姓名(`full_name`)和入职日期(`hire_date`),我们想要为每个员工分配一个基于入职日期的序号。

```sql
SELECT 
  employee_id,
  full_name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS row_num
FROM 
  employees;
```

这个查询将返回所有员工的信息,并为每个员工根据`hire_date`的升序分配一个唯一的序号。

如果我们想要在每个部门内为员工分配序号,可以添加`PARTITION BY`子句:

```sql
SELECT 
  employee_id,
  full_name,
  department_id,
  hire_date,
  ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY hire_date) AS row_num
FROM 
  employees;
```

在这个查询中,`ROW_NUMBER()`将在每个部门内独立地为员工分配序号,基于他们的入职日期。

### 分页查询示例:

如果你想要实现分页查询,可以使用`ROW_NUMBER()`结合`LIMIT`和变量来实现。假设你想要获取第2页的数据,每页显示10条记录:

```sql
SET @row_num = 0;
SELECT 
  employee_id,
  full_name,
  hire_date
FROM 
  employees
WHERE 
  @row_num := @row_num + 1
ORDER BY 
  hire_date,
  @row_num
LIMIT 10 OFFSET 10;
```

这个查询首先设置了一个会话变量`@row_num`,然后在`WHERE`子句中使用`@row_num`来实现序号的计数,最后使用`LIMIT`和`OFFSET`来获取第2页的数据。

`ROW_NUMBER()`是一个非常有用的开窗函数,它为数据集的行提供了一个清晰的编号机制,这在许多数据分析场景中都非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言线条样式和填充样式都有哪些? 怎样设置?

一、问题 线条样式和填充样式都有哪些?该怎样设置? 二、解答 在画图前,要先设置线条样式和填充样式,它们直接决定图形的显⽰效果。 1.线条样式 (1) setlinestyle( ) 函数。 void far setlinestyle(int linestyle, unsigned upa…

5G消息 x 文旅 | 一站式智慧文旅解决方案

5G消息 x 文旅 | 一站式智慧文旅解决方案 文旅 x 5G 消息将进一步强化资源整合,满足游客服务需求、企业营销需求、政府管理需求,推进文化旅游项目的智慧化、数字化,增强传播力、竞争力和可持续性。5G 消息的“原生入口”、“超强呈现”、“智…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十周) - 自然语言处理应用

自然语言处理应用 1. 问答系统 1.1. 信息检索1.2. 机器阅读理解1.3. 多跳问答 2. 对话系统3. 机器翻译4. 文本摘要 1. 问答系统 在自然语言处理领域,问答系统(Question Answering,QA)是一个广泛且重要的研究方向,其目的是让计算机根据给定的…

Unity3D TextMeshPro组件使用及优化详解

在Unity3D游戏开发中,文本渲染是一个不可或缺的部分。而TextMeshPro作为Unity的一个插件,提供了更高质量、更灵活的文本渲染功能,为开发者带来了极大的便利。本文将详细介绍TextMeshPro组件的使用技巧以及优化方法,并通过代码实例…

红队攻防渗透技术实战流程:组件安全:JacksonFastJsonXStream

红队攻防渗透实战 1. 组件安全1.1 J2EE-组件Jackson-本地demo&CVE1.1.1 代码执行 (CVE-2020-8840)1.1.2 代码执行(CVE-2020-35728)1.2 J2EE-组件FastJson-本地demo&CVE1.2.1 FastJson <= 1.2.241.2.2 FastJson <= 1.2.471.2.3 FastJson <= 1.2.801.3 J2EE-组…

帕金森病的食疗建议

帕金森病&#xff08;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响中老年人。虽然目前尚无法根治&#xff0c;但及早规范治疗可显著改善症状&#xff0c;提高患者的生活质量。饮食调理作为帕金森病综合治疗的重要组成部分&#xff0c;对于维持患者较…

jQuery中.text() 和 .val()辨析

在jQuery中&#xff0c;.text() 和 .val() 是两个用于操作DOM元素内容的常用方法&#xff0c;但它们有不同的用途和适用的元素类型。 .text() .text() 方法用于获取或设置匹配元素的文本内容。适用于以下元素&#xff1a; 普通HTML元素&#xff08;如<div>&#xff0c…

接口测试详解

接口测试详解 本文主要讲软件接口 一、什么是接口&#xff1f;硬件接口&#xff1a;硬件接口指的是硬件提供给外界的一种实体。主要作用是内部数据分离出外 部的沟通方法 目的是&#xff1a;沟通外部来改变内部的数据。如&#xff1a;USB接口&#xff0c;投影仪接口 软件接口…

速盾:linux防止ddos攻击

Linux作为一种开源操作系统&#xff0c;被广泛应用于服务器和网络设备中。然而&#xff0c;正因为其广泛使用&#xff0c;Linux服务器经常成为黑客和攻击者的目标。DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种常见的攻击方式&#xff0c;旨在通过大量恶意流量淹没目…

【CDN】逆天 CDN !BootCDN 向 JS 文件中植入恶意代码

今天在调试代码&#xff0c;突然控制台出现了非常多报错。 这非常可疑&#xff0c;报错指向的域名也证实了这一点。 因为我的 HTML 中只有一个外部开源库&#xff08;qrcode.min.js&#xff09;&#xff0c;因此只有可能是它出现了问题。 我翻看了请求记录&#xff0c;发现这…

Java -jar 运行 报 MalformedInputException: Input length = 1

Intellij IDEA 中运行正常&#xff0c;linux 运行正常&#xff0c; cmd 下运行 报&#xff1a;MalformedInputException: Input length 1 微服务项目&#xff0c;在Nacos中做了配置&#xff0c;在引用 Nacos中配置时&#xff0c;编码问题&#xff0c;导致的错误 org.yaml.sna…

【无线感知】【P3】无线感知手势识别-Ubicomp2022论文分享

前言&#xff1a; 本篇主要关于手势识别的方向的,主要参考 北京大学-《无线感知手势识别-Ubicomp2022论文分享》 目录&#xff1a; 技术背景 主要问题&#xff08;异质性问题&#xff09; 感知模型 EDP DPSense 实现效果 一 技术背景 基于WIFI的手势识别在智能家具,以…

遍历指定文件夹及其所有子文件夹目录,统计每种文件后缀的数量,并打印出来 python 代码

搜索所有层级的文件夹并统计每种文件后缀类型的数量,你可以使用 os 模块来递归地遍历文件夹,并使用 glob 模块来匹配文件。下面是一个示例代码,它将遍历指定目录及其所有子目录,并统计每种文件后缀的数量: import os import globdef count_file_extensions(directory):# 初…

前端BUG记录-a-spin和a-pagination

一、使用a-spin时&#xff0c;把你需要绘制样式的盒子要放在里面 <a-spin :spinning"loading"><div class"scrollable-div"></div> </a-spin> 不然样式容易效果不正确 二、a-pagination切换到第二页无效 给分页所在盒子设置ma…

Playbook角色

目录 1. 角色的目录结构 各个目录和文件的作用 2. 创建和使用角色 创建角色 使用角色 示例角色 3. 角色的优势 在Ansible中&#xff0c;角色&#xff08;Roles&#xff09;是一种高级的结构化方式&#xff0c;它允许将可重用的模块、组件以及配置整理和封装起来。角色的…

Rust 异步 trait 的实现困难

在 Rust 中&#xff0c;异步编程是使用 async/await 语法来实现的。与传统的同步编程不同&#xff0c;异步编程涉及到的特性较多&#xff0c;其中一个重要的特性是异步 trait。 异步 trait 是具有异步方法的 trait。在 Rust 中&#xff0c;trait 方法默认是同步的&#xff0c;…

ShardingSphere-proxy添加自定义分片规则(踩坑日记)

文章目录 一、新建spring boot项目二、编写代码(1) 新建一个类(2) doSharding方法详解(3) 实际例子 三、增加spi文件&#xff08;很关键&#xff09;四、打包五、把生成的文件放到ext-lib中六、yaml配置&#xff08;怎么用&#xff09;七、测试 版本环境 mysql 5.7.40 sharding…

英语复习之英语同音词总结(六)

之前的五个部分是总结的形近词&#xff0c;接下来开始总结同音词。 单词 (发音) 释义 例句 sight [saɪt] n. 视力&#xff1b;视野&#xff1b;景象 1. She has perfect sight. (她视力很好。) 2. The view from the top of the mountain is a breathtaking sight. (从山…

湘潭大学信息与网络安全复习笔记2(总览)

前面的实验和作业反正已经结束了&#xff0c;现在就是集中火力把剩下的内容复习一遍&#xff0c;这一篇博客的内容主要是参考教学大纲和教学日历 文章目录 教学日历教学大纲 教学日历 总共 12 次课&#xff0c;第一次课是概述&#xff0c;第二次和第三次课是密码学基础&#x…

[渗透测试学习] Runner-HackTheBox

Runner-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.13扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.18.0 (Ubuntu) 8000…