SQL 窗口函数

 窗口函数用于在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算,可以跨行计算。

随着窗口函数的出现,无须再使用关联子查询。窗口函数的可读性很好,代码也很简洁。

1 实践

1.1 营业额年度变化

需求:查找与上一年相比营业额没有变化的年份。

图 年度营业额t_year_sales 表

-- 关联子查询
SELECT *
FROM t_year_sales y1 
WHERE sale = (SELECT sale FROM t_year_sales WHERE `year` = y1.year - 1);
-- 左连接
SELECT *
FROM (SELECT y1.*,y2.sale AS preSaleFROM t_year_sales y1 LEFT JOIN t_year_sales y2 ON y2.`year` = y1.`year` - 1
) temp 
WHERE sale = preSale;
-- 窗口函数
SELECT *
FROM (SELECT *,MAX(sale) OVER ( ORDER BY `year` RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING ) AS preSaleFROM t_year_sales 
) temp 
WHERE sale = preSale;

1.1.1 时间轴有间断时:和过去最临近的时间进行比较

图 有间断的年度营业额t_year_sales2 表

需求:查询与过去最临近的年份营业额相同的年份。

-- 关联子查询 
SELECT *
FROM t_year_sales2 y
WHERE sale = (SELECT sale FROM t_year_sales2 WHERE `year` = (SELECT MAX(`year`) FROM t_year_sales2 WHERE `year` < y.year));
-- 窗口函数
SELECT *
FROM 
(SELECT *,MAX(`sale`) OVER(ORDER BY `year` ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS preSaleFROM t_year_sales2 y
) temp 
WHERE sale = preSale;

1.2 窗口函数与关联子查询

图 商品信息t_product_info 表

需求:按照商品种类查询销售单价高于平均销售单价的商品。

-- 关联子查询
SELECT *,(SELECT AVG(price) FROM t_product_info WHERE `type` = p.type) AS avgPrice
FROM t_product_info p 
WHERE price > (SELECT AVG(price) FROM t_product_info WHERE `type` = p.type);
-- 关联子查询
SELECT *
FROM (SELECT *,AVG(price) OVER (PARTITION BY `type`) AS avgPriceFROM t_product_info
) temp
WHERE price > avgPrice;

1.3 查询重叠的时间区间

图 酒店预约t_reservation2表

需求:查找出重叠时间的预定

-- 关联子查询
SELECT *
FROM t_reservation2 r 
WHERE EXISTS 
(SELECT *FROM t_reservation2 r1WHERE r1.reserver != r.reserver AND (r.start_date BETWEEN r1.start_date AND r1.end_dateOR r.end_date BETWEEN r1.start_date AND r1.end_date	OR (r.start_date <= r1.start_date AND r.end_date >= r1.end_date))
);

这个需求窗口函数较难实现。

1.4 移动平均值

图 银行账户存取款记录t_account表

需求:求当前取款额及最近三次平均取款额(当前行+前两行。当前两行记录不全时,根据既有数据求平均值)。

-- 窗口函数
SELECT *,AVG(amount) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS avgAmount
FROM t_account;
-- 关联子查询
SELECT *,(SELECT AVG(amount) FROM t_account WHERE `date` <= a.date LIMIT 3) AS avgAmount
FROM t_account a; 

需求:上面需求改为,当记录少于3行,平均值为NULL。

-- 窗口函数
SELECT *,
CASE WHEN COUNT(*) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) < 3 THEN NULL 
ELSE AVG(amount) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)  END AS avgAmount
FROM t_account;
-- 关联子查询
SELECT *,
CASE WHEN (SELECT COUNT(*) FROM t_account WHERE `date` <= a.date) < 3 THEN NULL 
ELSE (SELECT AVG(amount) FROM t_account WHERE `date` <= a.date LIMIT 3) END AS avgAmount
FROM t_account a; 

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

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

相关文章

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库&#xff0c;可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串&#xff0c;整型&#xff0c;浮点型等&#xff0c;且键是唯一的 4.键值对中…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;与网络安全已然深度交融&#xff0c;二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状&#xff08;2024&#xff09;》这份报告恰似一盏明灯&#xff0c;为…

光控资本 :股票支撑位是什么?股票支撑位怎么找?

股票支撑位是指在股票价格的前史K线走势有两次或者两次以上&#xff0c;出现下跌到某一方位&#xff0c;股票就出现反弹的走势&#xff0c;则投资者可以把这个方位称为支撑位&#xff0c;支撑位阐明下方托单较多&#xff0c;个股无法持续下跌&#xff0c;在托单的影响下&#x…

网站小程序app怎么查有没有备案?

网站小程序app怎么查有没有备案&#xff1f;只需要官方一个网址就可以&#xff0c;工信部备案查询官网地址有且只有一个&#xff0c;百度搜索 "ICP备案查询" 找到官方gov.cn网站即可查询&#xff01; 注&#xff1a;网站小程序app备案查询&#xff0c;可通过输入单位…

STM32+AI语音识别智能家居系统

基于 STM32 和 AI 语音识别的智能家居系统的详细硬件和软件设计&#xff0c;包括各个模块的详细描述和代码示例。 一、硬件设计 1. 微控制器&#xff08;STM32&#xff09;&#xff1a; 选择 STM32F7 系列或更高性能的芯片&#xff0c;如 STM32F767ZIT6&#xff0c;以满足处理…

【初阶一】初识c语言

【初阶一】初识c语言 一、为什么学C语言&#xff1f;二、学习前的准备1.搭建编译环境以及使用2.代码库GitHub/Gitee创建以及使用3.写博客的作用以及教学 三、个人感悟 一、为什么学C语言&#xff1f; C语言是一门经久不衰的计算机编程语言&#xff0c;有句话叫&#xff1a;万物…

Linux DRM 那些事 - HDMI 接口 DTS 配置

本文基于RockPI 4A单板Debian系统 Linux 4.4 内核介绍DRM框架HDMI接口DTS配置。 在DTS中主要实现&#xff1a;HDMI的使能、VOP绑定、IOMUX引脚配置和HDMI控制器配置。 一、HDMI 配置 文件&#xff1a;arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi #include "rk3…

QT仿QQ聊天项目,第三节,实现聊天界面

一&#xff0c;界面控件示意图 界面主要由按钮QPushButton,标签QLabel,列表QListWidget 要注意的是QListWidget既是实现好友列表的控件&#xff0c;也是实现聊天气泡的控件 二&#xff0c;控件样式 QPushButton#btn_name {border:none;}QPushButton#btn_close {border:1px;bac…

前端学习八股资料CSS(二)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

项目笔记:在stm32f103c8上用DMA控制串口收发

一、传统串口收发与引入DMA控制的区别 传统串口收发每一步都经过CPU处理和控制&#xff0c;当总线数据量大且频繁时CPU要反复地进入中断中处理&#xff0c;而引入DMA的差异就在于DMA会自动处理这个过程&#xff0c;并不需要占用CPU。 二、在不同芯片上所包含的DMA数量不同 对于…

基于SpringBoot的“原创歌曲分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“原创歌曲分享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 平台功能结构图 平台首页界面图 用户注册界面…

CLion配置QT开发环境

一、将qmake工程转为cmake工程&#xff08;方法一&#xff1a;用工具转换并做适当修改&#xff09; 1、工具链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码&#xff1a;7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

【动手学电机驱动】 STM32-FOC(7)基于 MCSDK6.0 控制与调试速度环

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

基于Ubuntu2410脚本搭建OpenStack-D版

openstack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务启动云主机 本次实验使用单节点搭建&#xff0c;Ubuntu2410系统&#xff1a;搭建openstack-D版&#xff0c;采用ovs网络组…

Vue 3 在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Vue 3 在现代前端开发中的应用 Vue 3 在现代前端开发中的应用 Vue 3 在现代前端开发中的应用 引言 Vue 3 概述 定义与原理 发展历…

QT鼠标事件

QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目&#xff0c;在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件&#xff0c;选择 C Class 自定义类名Mylabel&#xff0c;选择基类Base …

VUE tab栏选中状态与滚动项展示状态对应

实现效果 实现思路 记录滚动容器、滚动项的ref点击某一项tab时&#xff0c;滚动对应项到界面上监听滚动容器滚动&#xff0c;计算展示在界面的滚动项&#xff0c;选中对应tab项 关键代码 html <!-- tab栏 --> <a-tabs id"template-tab" v-model:activeK…

手动安装Ubuntu系统中的network-manager包(其它包同理)

自己手闲把系统中的network-manager包给删了&#xff0c;导致的结果就是Ubuntu系统彻底没有网络。结果再装network-manager时&#xff0c;没有网络根本装不了&#xff0c;网上的方法都试了也没用&#xff0c;然后就自己源码装&#xff0c;这篇文章就是记录一下怎么手动下载包然…

Qt初识简单使用Qt

使用C代码实现hello world 之前介绍过用图形化界面的方式创建hello world&#xff0c;这里我们使用C代码的方式再来实现一次hello world。 如上&#xff0c;首先要先包含一个头文件。 在QT这里&#xff0c;每一个类都有一个对应的同名头文件。比如这里我就包含了 <QLabel&…