mysql--窗口函数

2023-11-16

一、前言

由力扣题引发的一次窗口函数的学习,mysql从8.0开始支持窗口函数,使用窗口函数,会令我们的分组查询变得便捷。

二、概念

一、定义

窗口函数:对一个查询SQL,将其结果集按指定的规则进行分区,每个分区可以看作是一个窗口,分区内的每一行,根据其所属分区内的行数据进行函数计算,获取计算结果,作为该行的窗口函数结果值。

二、语法

<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

 <窗口函数>的位置,可以放以下两种函数:

1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。

2) 聚合函数,如sum. avg, count, max, min等

因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中

在这里插入图片描述

 

三、常见的排名场景

一、连续排名

例如薪水3000、2000、2000、1000排名结果为1-2-3-4,体现同薪不同名,排名类似于编号。

出现相同的数时,往后面顺移一位。对于这种可以使用窗口函数 row_number() over

如果不需要重复的,可以使用group by 去重后再排序,注意查询字段最好只有排序字段,和窗口函数,窗口函数计算出来的都是数字。

二、排名不连续

同样的薪水还有另一种排名要求:1-2-2-4;对于这一种可以使用窗口函数rank() over (跟着分组/排序条件)

三、排名连续(另一种)

同样的薪水还有另一种连续排名要求:1-2-2-3;对于这种类型的可以使用窗口函数dense_rank() over

最后可以参考以下博文:MySQL-窗口函数 - SmithBee - 博客园

四、力扣题窗口函数应用

select id, if(id % 2 = 1,lead(student,1,student) over (order by id), lag(student,1)over (order by id)) student
from seat

这里使用了两个窗口函数:lead()以及lag()

一、lead():

用于返回当前字段后n行的数据

语法格式:

LEAD(<expression>[,offset[, default_value]]) OVER (
    PARTITION BY (expr)
    ORDER BY (expr)
) 

expression:这里可以放字段名

offset:偏移量,向后取N行

必须是一个非负整数。如果offset为零,则LEAD()函数计算expression当前行的值。

default_value:

如果没有后续行,则LEAD()函数返回default_value。例如,如果offset是1,则最后一行的返回值为default_value

如果您未指定default_value,则函数返回  NULL 。

PARTITION BY子句:

PARTITION BY子句将结果集中的行划分LEAD()为应用函数的分区。

如果PARTITION BY未指定子句,则结果集中的所有行都将被视为单个分区

可用于计算当前行和后一行之间的差异。

二、lag(): 

用于返回当前字段前n行的数据

语法结构:

LAG(<expression>[,offset[, default_value]]) OVER (
    PARTITION BY expr,...
    ORDER BY expr [ASC|DESC],...
) 

所有属性和ead():一样

可用于计算当前行和上一行之间的差异。

官网提供的几个窗口函数: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql--窗口函数 的相关文章

  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • MySQL集群启动失败

    这不是我第一次创建ndbcluster 但我没有收到这样的问题 我正在关注本手册 https hub docker com r mysql mysql cluster by mysql团队 我正在使用回显的默认配置在此 GitHub 存储库
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • MySQL - 从数字列表中选择在表的 id 字段中没有对应项的数字

    我有一个数字列表 例如 2 4 5 6 7 我有一个表 foos 带有 foos ID 包括 1 2 3 4 8 9 我想获取我的号码列表 并在我的表的 ID 字段中找到那些没有对应项的号码 实现此目的的一种方法是创建一个表格栏 在 ID
  • MySQL JOIN 滥用?情况会变得有多糟糕?

    我读了很多关于关系数据库的文章 在每个 SELECT 上使用许多 JOIN 语句 但是 我一直想知道滥用这种方法从长远来看是否会出现任何性能问题 例如 假设我们有一个users桌子 我通常会添加 最常用 的数据 而不是进行任何额外的联接 例
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • “修改列”与“更改列”

    我知道 我们不能使用重命名列MODIFY COLUMN语法 但我们可以使用CHANGE COLUMN syntax 我的问题是 主要用途是什么modify syntax 例如 ALATER TABLE tablename CHANGE co
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 如何为 MySQL 中的字段或列添加别名?

    我正在尝试做这样的事情 但我收到未知的列错误 SELECT SUM field1 field2 AS col1 col1 field3 AS col3 from core 基本上 我只想使用别名 这样我就不需要执行之前执行的操作 这在mys
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr

随机推荐

  • sel4白皮书翻译

    首发地址 http trialley top pages 53ac44 CSDN地址 https blog csdn net lgfx21 article details 117606097 翻译与转发许可 作者 Gernot Heiser
  • 方方格子授权码_OAuth2入门(三)——Authorization Code授权模式

    1 前言 前面的文章讲到 oauth支持四种授权模式 简化模式 implicit 授权码模式 authorization code 密码模式 resource owner password credentials 客户端模式 client
  • 拆分android项目导致run Configurations消失了

    事件缘由 由于APP要拆分成两个 把原来的APP从svn上面下载下了 重新上传到新的svn目录上 再次重svn上面下载下来到本地新文件夹是直接用svn来运行时 发现原来run Configurations 不见了 重新编译同步啥的都没有用
  • 软件测试工具介绍和使用

    此次为软件工程实践专题 个人博客第四次作业 请使用一些其他平台上的测试工具 并写博客介绍如何在你的项目中具体使用 一 JMeter 介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具 是100 纯JAVA桌面
  • 多线程数据库连接管理1

    最近公司项目需求 要从oracle往mysql迁移存量1 2亿数据 处理逻辑比较复杂 硬件方面 对机器性能要求较高 软件方面 受制于外部服务能力 因此 在开发过程中 需要特别注意各方面资源的管理 及时释放占用的资源 调优过程中 数据库方面遇
  • OSI七层模型与TCP/IP五层模型

    一 OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识 OSI参考模型 1 OSI的来源 OSI Open System Interconnect 即开放式系统互联 一般都叫OSI参考模型 是ISO 国际标准化组织 组织在1985
  • 用友时空KSOAV9.0文件上传漏洞复现

    一 使用fofa进行资产搜集 语句 app 用友 时空KSOA 访问相关页面 二 漏洞地址 文件上传 POST servlet com sksoft bill ImageUpload filename test jsp filepath 使
  • vue实现列表数据分页

    在开发过程中 当数据不是非常多的时候 前端来处理列表数据的分页 下面分享几个关键的步骤代码 1 请求全部数据过来 getList let params inParams this axios url httpUrl assetsIpArea
  • List中添加多种数据类型 反射

    原文参考地址 http blog csdn net sinat 28789467 article details 57415998 总结来说 以下代码 ArrayList
  • 面试题(1)封装c++

    前言 在学习的过程中我开始积累面试题 让我们一起开始学习 进步吧 卷起来 封装的定义 定义 将数据和操作数据的方法进行有机结合 隐藏对象的属性和实现细节 仅对外公开接口来和对象进行交互 封装本质上是一种管理 就好比如办画展的时候我们要把画用
  • RSA算法简介

    RSA算法简介 一 RSA算法简述 在RSA密码体制中 每个用户都拥有两个密钥 公钥PK e n 和私钥SK d n 公钥PK e n 用于加密 也成为加密密钥 可以再网络 电话簿等媒体上进行公布 私钥SK d n 用于解密 也称为解密密钥
  • 刀片式服务器与虚拟机,为什么人们在开发虚拟主机时更喜欢刀片服务器?

    服务器制造商正在不断开发刀片技术 因此刀片服务器的处理器性能和内存容量已达到10年前的超级计算机水平 毫无疑问 刀片服务器曾经实现了 事半功倍 的承诺 但现在需要重新考虑这个问题 人们为什么在虚拟主机的开发中更喜欢刀片服务器 使刀片服务器缺
  • 为什么mysql source命令导入数据比可视化工具执行sql文件快?

    在一般情况下 使用MySQL的source命令导入数据比使用可视化工具执行SQL文件更快 这是因为涉及到了不同的执行方式和优化策略 批量执行 vs 逐条执行 source命令会将整个SQL文件作为一个批量进行执行 而可视化工具往往是逐条读取
  • VS Code搭配code runnner编译时提示:g++: fatal error: no input files解决方法

    如下图所示 如果我们使用的是windows系统 当我们编写好C 文件之后 执行run code命令 就会出现的下面的错误提示 g error testCodeRunnner cpp No such file or directory g f
  • Even Degree【2020 年 “游族杯”E题】【欧拉回路】

    题目链接 题意 有N个点 M条边 每次可以删去一条两端点的度不都是奇数的边 问最多可以删除几条边 题目保证初始所有点度为偶数 首先 题目保证了初始的时候所有的点的度都是为偶数的 于是原图中的每一个联通块一定是一个欧拉回路 对于欧拉回路 最好
  • android:configChanges属性

    今天有幸去哥们的大公司做了半天的暂时工 一个偶现的Bug折腾了他好久 好不easy今天抓到了异常Log日志 大致的意思就是android view windowleaked 窗口泄漏 我在网上查了资料 Android的每个Activity都
  • 简单使用visio画时序图

    1 时序图作用 时序图是强调消息时间顺序的交互图 描述了对象之间传递消息的时间顺序 用来表示用例中德行为顺序 纵轴是时间轴 时间沿竖线向下延伸 横轴代表了协作各独立的对象 2 时序图包含了4个元素 1 对象 Object 2 生命线 Lif
  • h2数据库 mysql 区别_开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库...

    开源数据库 H2 HSQLDB DERBY PostgreSQL MySQL区别 对比图表 浪天涯博主翻译 referential integrity 参考完整性 transactions 事物 unicode 统一码 interface
  • 推荐一些PyCharm中常用的插件,实用且炫酷

    工欲善其事 必先利其器 PyCharm 上面的插件是非常实用的 能够巧妙的使用插件对于我们的开发功能的帮助非常大 下面小编为大家推荐一些不错的插件 1 Key Promoter X 快捷键 用来提示快捷键的插件 帮助我们尽可能的摆脱鼠标操作
  • mysql--窗口函数

    一 前言 由力扣题引发的一次窗口函数的学习 mysql从8 0开始支持窗口函数 使用窗口函数 会令我们的分组查询变得便捷 二 概念 一 定义 窗口函数 对一个查询SQL 将其结果集按指定的规则进行分区 每个分区可以看作是一个窗口 分区内的每