SQL CASE表达式与窗口函数
CASE 表达式是一种通用的条件表达式,类似于其他编程语言中的if/else语句。
窗口函数类似于group by,但是不会改变记录行数,能扫描所有行,能对每一行执行聚合计算或其他复杂计算,并把结果填到每一行中。
1 CASE 表达式
CASE 表达式有简单CASE表达式和搜索CASE表达式两种写法:
-- 简单 CASE 表达式
CASE `status`WHEN 1 THEN '正常'WHEN 0 THEN '审核中'ELSE '锁定'
END-- 搜索CASE表达式
CASE WHEN `status` = 1 THEN '正常'WHEN `status` = 0 THEN '审核中'ELSE '锁定'
END
1.1 在SELECT 与 GROUP BY 中同时使用
图 城市人口信息表t_city_info
需求:根据上表,统计对应省份的人口数。
图 统计出的对应人口数
SELECT
CASE city
WHEN '九江' THEN '江西'
WHEN '赣州' THEN '江西'
WHEN '南昌' THEN '江西'
WHEN '深圳' THEN '广东'
WHEN '广州' THEN '广东'
WHEN '韶关' THEN '广东'
WHEN '惠州' THEN '广东'
ELSE '其他'
END AS '省份',
SUM(population) AS '人口'
FROM t_city_info
GROUP BY
(
CASE city
WHEN '九江' THEN '江西'
WHEN '赣州' THEN '江西'
WHEN '南昌' THEN '江西'
WHEN '深圳' THEN '广东'
WHEN '广州' THEN '广东'
WHEN '韶关' THEN '广东'
WHEN '惠州' THEN '广东'
ELSE '其他'
END
)
1.2 在聚合函数内使用CASE表达式
图 表城市男女人口数量表t_city_info,1 表示男性 0 表示女性
需求,根据上表统计出各市男女数量,输出格式如下:
图 各市男女数量
SELECT city as '城市',
SUM(
CASE sex
WHEN 1 THEN population
ELSE 0
END
) AS '男性',
SUM(
CASE sex
WHEN 0 THEN population
ELSE 0
END
) AS '女性'
FROM t_city_info
GROUP BY city
1.3 在update里使用CASE
图 员工薪资信息表t_emplpyee及薪资调整
需求:工资25000以上的降薪10%,10000以下的涨薪2000。
UPDATE t_employee
SET salary =
CASE WHEN salary > 25000 THEN salary * 0.9WHEN salary < 10000 THEN salary + 2000ELSE salary
END
1.4 在CASE里使用嵌套子查询
图 课程信息表t_course_info 与 开课情况t_course_open表
需求:统计各课程每月开课情况。
图 各课程每月开课情况
SELECT
`name` AS '课程',
(CASE WHEN EXISTS (SELECT `course_id`FROM t_course_openWHERE `month` = '202408' AND course_id = id ) THEN 'YES'ELSE 'no'END
) AS '8月',
(CASE WHEN EXISTS(SELECT `course_id`FROM t_course_openWHERE `month` = '202409' AND course_id = id ) THEN 'YES'ELSE 'no'END
) AS '9月',
(CASE WHEN EXISTS (SELECT `course_id`FROM t_course_openWHERE `month` = '202410' AND course_id = id ) THEN 'YES'ELSE 'no'END
) AS '10月'
FROM t_course_info
1.5 在CASE中使用聚合函数
图 学生加入俱乐部情况t_student_club 表
学生加入俱乐部情况:1)1个学生可以加入多个俱乐部;2)如果加入了多个俱乐部,Y标志主俱乐部,只加入一个俱乐部标注N。
需求:1)列出学生参加的主俱乐部。2)如果学生只假如一个俱乐部,则也为主俱乐部。
SELECT student_id AS '学生',
CASE WHEN COUNT(*) = 1 THEN club_nameELSE MAX(CASE WHEN main_flg = 'Y' THEN club_name ELSE NULL END)
END AS '主俱乐部'
FROM t_student_club
GROUP BY student_id
2 窗口函数
窗口函数和聚合函数共同点在于它们也是对一组数据进行分析。但是窗口函数不是将一组数据汇总为单个结果,而是针对查询中的每一行数据,基于和它相关的一组数据计算出一个结果。语法如下:
window_fun (expr) over (
partition by …
order by …
frame_clause
)
PARTITION BY 子句分隔记录集合,类似于group by
ORDER BY 子句对记录排序
frame_clause 串口大小,帧子句,定义以当前记录为中心的子集。
2.1 匿名窗口与命名窗口
图 服务器每日请求量t_service_load 表
需求:列出服务器每日请求量、前两日请求评价数。
SELECT `date`,`load`,
AVG(`load`) OVER (ORDER BY `date`ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) AS avgLoad
FROM t_service_load;
2.1.1 命名窗口
SELECT `date`,`load`,
AVG(`load`) OVER loadW AS avgLoad,
SUM(`load`) OVER loadW AS sumLoad
FROM t_service_loadWINDOW loadW AS (ORDER BY `date`ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
)
2.2 帧子句
ROWS | 按行设置移动单位。 |
RANGE | 按列值设置移动单位。使用ORDER BY 子句来指定基准列。 |
n PRECEDING | 仅向前(行号较小的方向)移动n行。 |
n FOLLOWING | 仅向后移动n行。 |
UNBOUNDED PRECEDING | 一直移动到最前面。 |
UNBOUNDED FOLLOWING | 一直移动到最后面。 |
CURRENT ROW | 当前行。 |
表 帧子句中可以使用的选项
需求:统计上表中,两日前的请求量。
SELECT `date`,`load`,
MAX(`load`) OVER (ORDER BY `date` ASC RANGE BETWEEN INTERVAL 2 DAY PRECEDING AND INTERVAL 2 DAY PRECEDING
) AS preLoad
FROM t_service_load;
相关文章:

SQL CASE表达式与窗口函数
CASE 表达式是一种通用的条件表达式,类似于其他编程语言中的if/else语句。 窗口函数类似于group by,但是不会改变记录行数,能扫描所有行,能对每一行执行聚合计算或其他复杂计算,并把结果填到每一行中。 1 CASE 表达式…...

基于SpringBoot的植物园管理小程序【附源码】
基于SpringBoot的植物园管理小程序 效果如下: 系统登录页面 管理员主页面 商品订单管理页面 植物园信息管理页面 小程序主页面 小程序登录页面 植物信息查询推荐页面 研究背景 随着互联网技术的快速发展和移动设备的普及,线上管理已经成为各行各业提高…...
asp.net网站项目如何设置定时器,定时获取数据
在 Global.asax.cs 文件中编写代码来初始化和启动定时器。Global.asax.cs 文件定义了应用程序全局事件,比如应用程序的启动和结束。在这里,我们将在应用程序启动时初始化和启动定时器。 using System; using System.Timers;public class Global : Syste…...

单元/集成测试解决方案
在项目开发的前期针对软件单元/模块功能开展单元/集成测试,可以尽早地发现软件Bug,避免将Bug带入系统测试阶段,有效地降低HIL测试的测试周期,也能有效降低开发成本。单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被…...

高效作业跟踪:SpringBoot作业管理系统
1 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的…...

keepalived + nginx 实现网站高可用性(HA)
keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 三、虚拟ip 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用…...
有哪些编辑器,怎样选择编辑器
1. Visual Studio Code (VSCode) 特点: 轻量级且强大:启动速度快,占用资源少,但功能强大。跨平台:支持 Windows、macOS 和 Linux。丰富的扩展生态:拥有庞大的扩展市场,可以安装各种插件来扩展功…...

软件系统开发
目录 软件开发方法 软件开发生命周期 软件开发模型 敏捷方法 敏捷型方法两个特点 敏捷方法的核心思想三点 4个核心价值观 主要敏捷方法 RUP RUP的核心特点: RUP软件开发生命周期 9个核心工作流 RUP裁剪 软件系统工具 软件开发工具 需求分析工具 设计…...
浅谈RPC的实现原理与RPC实战
浅谈RPC的实现原理与RPC实战 什么是RPC?RPC框架基本原理gRPC框架介绍Http/2ProtoBuf gRPC实战一、创建项目二、导入依赖三、编写proto文件编写服务端编写客户端 什么是RPC? RPC(Remote Procedore Call),及远程过程调用,是一种在分布式系统中用于进程间…...

算法|牛客网华为机试31-40C++
牛客网华为机试 上篇:算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…...

Mysql 大表limit查询优化原理
优化前( 查询耗时 114.1s) explain select * from link_exec_task limit 80000, 10 # 查询耗时 114.1s优化后( 查询耗时 0.121s) explain select * from link_exec_task a INNER JOIN (select id from link_exec_task limit 80000, 10) b on a.id b.id #0.121s原理&…...
封装axios、环境变量、api解耦、解决跨域、全局组件注入
官网:Axios中文文档 | Axios中文网 安装:npm install axios axios封装: // 1. 引入axios import axios from "axios"; import storage from /utils/storage // 2. 创建axios实例 const instance axios.create({baseURL: proces…...

CDGP|数据治理于企业而言到底有什么用?
在当今数字化时代,数据已成为企业最重要的资产之一。无论是大型跨国公司还是初创型企业,数据都扮演着驱动决策、优化运营和推动创新的关键角色。然而,仅仅拥有大量的数据并不足以确保企业的成功。如何有效管理、整合和利用这些数据࿰…...
Java学习教程,从入门到精通,Java数组(Arrays)语法知识点及案例(19)
1、Java数组(Arrays)语法知识点及案例 一、数组的基本概念 数组是多个相同类型的数据按照一定的顺序排列的集合,使用一个名字命名,通过编号(索引)的方式对这些数据进行统一管理。数组是引用数据类型&…...
11.4OpenCV_图像预处理习题02
1.身份证号码识别(结果:身份证号识别结果为:911124198108030024) import cv2 import numpy as np import paddlehub as hubdef get_text():img cv2.imread("images1/images/shenfen03.jpg")# 灰度化gray_img cv2.cvt…...
go的template示例
模板定义: type Config struct {{{- $len : len .DbConfigs -}}{{- $i : 0 -}}{{- range $key, $value : .DbConfigs}}{{title $key}} *DbConfig "yaml:\"{{lower $key}}\"" {{if lt $i (sub $len 1)}},{{end}}{{- $i add $i 1 -}}{{- end…...
『YOLO』| 断点训练、解决训练中断异常情况
文章目录 方法一方法二 当yolo在训练的时候,如果训练中断或者出现异常,可通过修改代码,从上一次断掉处重新训练,实现断点续训。 方法一 第一种方法: 按照官方给出的恢复训练代码,用yolo命令格式ÿ…...
MQTT+Disruptor 提高物联网高并发
基于springboot2.5.7 废话不多说,直接上干货: Slf4j Configuration EnableConfigurationProperties(MqttProperties.class) IntegrationComponentScan(basePackages {"扫描包路径","扫描包路径"}) public class MqttAutoConfig {…...

SpringBoot项目集成ONLYOFFICE
ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…...
用于nodejs的开源违禁词检测工具 JavaScript node-word-detection
地址 : https://www.npmjs.com/package/node-word-detection github地址: https://github.com/xiaobaidadada/node-word-detection 非常节省内存的轻量级快速违禁词、词典库 检测工具 、 50万个词大约需要300MB内存、被检测的文本100字内结果在1毫秒左右。本项目没有提供词库请…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...