SQL开窗函数之前后函数(LEAD、LAG)

news2024/11/18 15:36:06

开窗函数

当我们需要进行一些比较复杂的子查询时,聚合函数就会非常的麻烦,因此可以使用开窗函数进行分组再运用函数查询。窗口函数既可以显示聚集前的数据,也可以显示聚集后的数据,可以在同一行中返回基础行的列值和聚合后的结果列

常见运用场景: 对班里同学成绩进行排序

常见的窗口函数
在这里插入图片描述

开窗函数基本形式

func_name(<parameter>) 
OVER(
[PARTITION BY <part_by_condition>] 
[ORDER BY <order_by_list> ASC|DESC]
[rows between ?? And ??]
)

具体字段的解释看我的上一篇:SQL开窗函数之基本用法和聚合函数


前后函数

LEAD函数和 LAG函数主要用于查询当前字段的上一个值或下一个值,若向上取值或向下取值没有数据的时候显示为NULL

  • LEAD: 向后偏移
  • LAG: 向前偏移
LAG(<expression>,offset,default_value) 
OVER(
     PARTITION BY expr,
     ORDER BY expr [ASC|DESC]
	)

字段解释

  • Expression: 需要被偏移的字段
  • Offset: 偏移的量
  • default_value: 超出记录窗口时的默认值(可以设置为0,默认为null)

应用1:前后日期温度比较
weather表
在这里插入图片描述

  • 获取前一天的温度和后一天的温度
select *,
lead(temperature, 1) over(order by recordDate) as lead_temp,
lag(temperature, 1) over(order by recordDate) as lag_temp
from weather

在这里插入图片描述

  • 获取与当天比前一天温度更高的日期
with a as (       
select *,
lead(temperature, 1) over(order by recordDate) as lead_temp,
lag(temperature, 1) over(order by recordDate) as lag_temp
from weather
)
select * from a 
where lag_temp < temperature

在这里插入图片描述


应用2:求出连续登录5天的用户
LeetCode:1454.活跃用户

用户登录表
在这里插入图片描述

题解:

  1. 用户可能同一天登录了多次,而我们只需要一个登陆日期,因此需要 group by user_id, login_time 去重
  2. 用 lead() over() 窗口函数查找往下第4个登录日期
  3. 用datediff查找往下第4个登陆日期是否与当前日期相差4天,即连续5天

lead找出天数差

select user_id, login_time, 
lead(login_time,4) over(partition by user_id order by login_time) as '5次后登录的时间', 
datediff(lead(login_time,4) over(partition by user_id order by login_time), login_time) as '天数差'
from user_login
group by user_id, date(login_time);

然后从上面找到连续登录了5天的用户,即 “天数差” 为4的用户

-- 完整代码
with a as(
select user_id, login_time, 
lead(login_time,4) over(partition by user_id order by login_time) as '5次后登录的时间', 
datediff(lead(login_time,4) over(partition by user_id order by login_time), login_time) as date_diff
from user_login
group by user_id, date(login_time)
)
select distinct user_id from a where date_diff = 4;

在这里插入图片描述


这里主要用到的两个例子,建表如下

-- weather表
drop table if exists weather;
create table weather(
    id int,
    recordDate date,
    temperature int
);
insert into weather
values (1,'2015-01-01',10),
       (2,'2015-01-02',25),
       (3,'2015-01-03',20),
       (4,'2015-01-04',30);

-- 用户登录表
drop table if exists user_login;
create table user_login
( 
user_id varchar(100), 
login_time datetime
); 

insert into user_login values 
(1,'2020-11-25 13:21:12'), 
(1,'2020-11-24 13:15:22'), 
(1,'2020-11-24 10:30:15'), 
(1,'2020-11-24 09:18:27'), 
(1,'2020-11-23 07:43:54'), 
(1,'2020-11-10 09:48:36'), 
(1,'2020-11-09 03:30:22'), 
(1,'2020-11-01 15:28:29'), 
(1,'2020-10-31 09:37:45'), 
(2,'2020-11-25 13:54:40'), 
(2,'2020-11-24 13:22:32'), 
(2,'2020-11-23 10:55:52'), 
(2,'2020-11-22 08:56:33'),
(2,'2020-11-22 06:30:09'), 
(2,'2020-11-21 08:33:15'), 
(2,'2020-11-20 05:38:18'), 
(2,'2020-11-19 09:21:42'), 
(2,'2020-11-02 00:19:38'), 
(2,'2020-11-01 09:03:11'), 
(2,'2020-10-31 07:44:55'), 
(2,'2020-10-30 08:56:33'), 
(2,'2020-10-29 09:30:28'); 

参考来源:
MySQL8中的开窗函数
SQL练习题:连续登录5天的活跃用户

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

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

相关文章

cubeIDE开发, 全面解析cubeMX图形配置工具

一、cubeIDE 集成cubeMX STM32CubeMX是st公司早期产品&#xff0c;现已经成为STM32Cube开发套件的一部分&#xff0c;直接集成到cubeIDE 开发平台省&#xff0c;是一种芯片引脚图形配置工具&#xff0c;可以非常轻松地配置STM32微控制器和微处理器&#xff0c;以及为Arm Cortex…

java+MySQL基于ssm的公文流转关管理系统

在企业的日常管理过程中,公文管理是日常管理中必不可少的组成部分,其管理水平的高低体现了一个企业管理水平的整体状况。一直以来企业使用传统人工的方式管理公文数据,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,为操作人员带来不少…

python_selenium自动化测试框架

设计思路 本文整理归纳以往的工作中用到的东西&#xff0c;现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架&#xff0c;能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff0…

cdp4j爬虫自动化学习

cdp4j爬虫自动化学习cdp4j介绍依赖通过识别本地文件进行调试cdp4j介绍 cdp4j是一个Java库&#xff0c;它提供了高级API来通过DevTools协议控制Chrome或Chromium。它可以用于自动使用网页和测试网页。cdp4j默认情况下可以完全运行&#xff0c;但可以配置为运行无头Chrome或Chro…

Spring Cloud Eureka 服务注册中心怎么配置

Eureka&#xff0c;这里是 Spring Cloud Eureka 的简称&#xff0c;是 Spring Cloud Netflix 组件之一。Spring Cloud Netflix 中核心的组件包括了服务治理&#xff08;Eureka&#xff09;&#xff0c;服务容断&#xff08;Hystrix&#xff09;&#xff0c;路由&#xff08;Zuu…

hypermesh和lsdyna联合仿真计算某汽车座椅进行的头冲吸能实验

导读&#xff1a;本案例运用hypermesh和lsdyna联合仿真&#xff0c;主要是针对某座椅进行的头冲吸能实验的仿真计算。这个工况考察座椅背部的塑料件的破坏情况&#xff0c;以及头部模块的加速度情况&#xff0c;达到保护人头部的效果。 本案例用户可以学习到&#xff1a; 1…

大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest)

大学生程序设计创新实践基地2022年冬季校赛&#xff08;NPU ACM Winter Contest&#xff09; 总述 总体考察对于板子的熟练变换&#xff0c;以及考察离谱地使用python和对getchar()以及EOF的基础掌握程度。 B&#xff0c;D&#xff0c;E是防AK题目。 题解 A死锁 ​ input…

【第九章 SQL优化_插入数据,主键优化,order by优化】

第九章 SQL优化_插入数据&#xff0c;主键优化&#xff0c;order by优化 1.插入数据&#xff1a; &#xff08;1&#xff09;insert&#xff1a; &#xff08;1&#xff09;批量插入数据&#xff1a; Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); &#xff08;2&am…

PyTorch(五)神经网络基础

文章目录Log一、Containers 基本骨架1. Module2. Sequential二、 Convolution Layers 卷积层1. torch.nn.functional① Conv2d2. torch.nn① Conv2d三、Pooling layers 池化层1. nn.MaxPool2d 下采样&#xff08;最大池化&#xff09;四、Non-linear Activations 非线性激活1. …

2022CCSP T1最少充电次数

记录第一次CCSP竞赛。一共3题&#xff0c;只做出第一题&#xff0c;用时3h30m&#xff08;累&#xff09;&#xff0c;ac了开心地吃了个午饭。然而饭饱之后&#xff0c;大脑完全提不起神看着题面昏昏欲睡。第二题是虚拟内存&#xff0c;超级大模拟&#xff0c;刚好这个学期学os…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java流浪动物救助网站a1wsz

毕业设计也不需要做多高端的程序&#xff0c;毕业设计对于大多数同学来说&#xff0c;为什么感觉到难&#xff0c;最重要的一个原因&#xff0c;那就是理论课到实践课的转变&#xff0c;很多人一下不适应&#xff0c;本能开始拒绝&#xff0c;如果是一个考试&#xff0c;大家都…

ITU、MCC和MNC介绍以及China运营商对照表

相关概念 ITU 国际电信联盟是联合国负责信息通信技术&#xff08;ICT&#xff09;事务的专门机构。 国际电联成立于1865年&#xff0c;为了促进国际上通信网络的互联互通。他们进行全球无线电频谱和卫星轨道的划分&#xff0c;制定技术标准以确保实现网络和技术的无缝互连&…

【Docker】30条Docker常用命令图文举例总结

本期目录1. 帮助启动类命令2. 镜像命令2.1 列出镜像2.2 搜索远程库镜像2.3 拉取镜像2.4 查看所占空间2.5 删除镜像2.6 面试题3. 容器命令3.1 新建启动容器1&#xff09;启动交互式容器3.2 列出当前所有正在运行的容器3.3 退出容器3.4 启动已停止的容器3.5 重启容器3.6 停止容器…

第六章 映射:Mappings

文章目录1、Mapping 简介1.1 mapping 是啥&#xff1f;1.2 如何查看索引映射2、自动映射&#xff1a;dynamic mapping2.1 自动类型推断规则2.2 mapping 的使用禁忌2.3 自动映射器的意义是什么&#xff1f;3、手动映射&#xff1a;Explicit mapping3.1 创建索引的 mapping3.2 修…

电子产品量产工具项目开发中遇到的问题(更新......)

1、找不到tslib.h库的头文件 这是因为找不到tslib库的头文件。 确定工具链中头文件、库文件目录&#xff0c;对于 IMX6ULL &#xff0c;命令如下 echo main(){}| arm-linux-gnueabihf-gcc -E -v -找到了编译器arm-linux-gnueabihf的include和lib文件夹 /usr/local/arm/gcc-l…

AT155 高压绝缘电阻测试仪 都有哪些功能?

、 高压绝缘电阻测试仪是—款手持式仪表主要用来测量交流&#xff0f;直流电压、 电阻、 短路蜂鸣测试和 绝缘电阻测量。 式高压绝缘电阻测试仪具有4个量程用千绝缘电阻、 AC/DC电压、 电阻和短路蜂鸣测试。 设计达到以下安全标准 &#xff0e;绝缘测试量程O.lMn to 60Gn。…

机器学习 决策树基础 ID3、C4.5、CART

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比划分策略ID3定义举例计算各属性的信息增益选取最优属性作划分对子节点作递归划分生成结果ID3的缺点C4.5信息增益率优化缺点CARTCART相较于前两者…

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示&#xff1a; MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期&#xff0c;单位为毫秒UINT uResolution, // 定时事件的精度&#xff0c;单位…

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁&#xff1a; 推荐网站 mysql学习网站&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了&#xff0c;说实话&#xff0c;我之前是一场球都没有&#xff0c;对足球知道也甚少&#xff0c;妥妥一个假球迷了。这次世界杯感觉离自己特别近&#xff0c;身边的很多朋友都在看&#xff0c;也不乏赌球的小伙伴&#xff0c;自己的感悟也比较深&a…