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.9
	 WHEN salary < 10000 THEN salary + 2000
	 ELSE salary 
END

1.4 在CASE里使用嵌套子查询

图 课程信息表t_course_info 与 开课情况t_course_open表

需求:统计各课程每月开课情况。

图 各课程每月开课情况

SELECT 
`name` AS '课程',
(
	CASE 
		 WHEN EXISTS  
				(SELECT `course_id`
				 FROM t_course_open
				 WHERE `month` = '202408'	AND course_id = id 
				) 
		 THEN 'YES'
		 ELSE 'no'
	END	 
) AS '8月',
(
	CASE 
		 WHEN EXISTS
				(SELECT `course_id`
				 FROM t_course_open
				 WHERE `month` = '202409'	AND course_id = id 
				) 
		 THEN 'YES'
		 ELSE 'no'
	END	 
) AS '9月',
(
	CASE 
		 WHEN EXISTS 
				(SELECT `course_id`
				 FROM t_course_open
				 WHERE `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_name
	ELSE 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_load

WINDOW 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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之位算法

位算法 常见位运算总结 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;3 解释…

【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案

&#x1f984;个人主页: 起名字真南 &#x1f984;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 题目分析示例&#xff1a; 3. 解题思路4. C代码实现5. 代码详解6. 时间和空间复杂度分析7. 边界情况分析8. 总结 1. 引言 在开发中&#xff0c;有时我们…

用Python将PDF表格提取到文本、CSV和Excel文件中

从PDF文档中提取表格并将其转换为更易于处理的格式&#xff08;如文本、CSV和Excel文件&#xff09;&#xff0c;是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理&#xff0c;使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文&am…

如何在 IntelliJ IDEA 中调整 `Ctrl+/` 快捷键生成注释的位置

前言 在使用 IntelliJ IDEA 编写代码时&#xff0c;注释是代码可读性和维护性的重要组成部分。IDEA 提供了快捷键 Ctrl/ 用于快速生成单行注释。然而&#xff0c;默认情况下&#xff0c;使用此快捷键生成的注释会出现在行首&#xff0c;导致注释与代码之间存在较大的空格&…

深入理解对象池 sync.Pool

文章目录 前言应用使用源码走读数据结构Get获取对象Put归还对象poolDeque分析GC时 总结 前言 当多个 goroutine 都需要创建同⼀种对象的时候&#xff0c;如果 goroutine 数量过多&#xff0c;导致对象的创建剧增&#xff0c;进⽽导致 GC 压⼒增大。形成下面的恶性循环&#xf…

项目管理(软设软考高频)

一、进度管理 1.Gantt图 2.PERT图 二、风险管理 三、沟通管理 四、成本管理

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

gradle下载的jar包,源码出现Decompiled .class file, bytecode version

如下是问题截图 问题产生原因&#xff1a; gradle依赖下载只下载了jar包&#xff0c;这导致idea在读取jar包时&#xff0c;需要通过Fernflower技术对jar包进行反编译&#xff0c;而反编译过程中只会保留源码信息&#xff0c;因此注释等额外信息全部丢失 解决方案&#xff1a…

[357]基于springboot的中小型制造企业质量管理系统

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

SAP(PP生产制造)拆解工单业务处理

1、BOM维护 要拆解的成品或半成品要和原成品、半成品BOM一致 2、创建拆解工单 CO01选择拆解工单的类型&#xff0c;以及填写拆解的物料和拆解工厂 维护工单组件 注意&#xff1a; 1、拆解入库组件的数量需要维护为负数 2、拆解工单投料组件数量维护为正数 3、拆解工单收发…

NavVis LX系列产品典型应用—现有住宅装修改造-沪敖3D

现有住宅装修改造项目的 数据捕捉和测量技术 当Jay Ure着手翻新和美化自己的新家时&#xff0c;他敏锐地发现这是现场测试NavVis VLX的绝佳机会。 为了全面评估&#xff0c;他聘请了一位工程师&#xff0c;采用传统的全站仪技术进行地形测绘。之后&#xff0c;他用移动扫描设…

【初阶数据结构篇】链式结构二叉树(续)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(5)_单例模式与线程池 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&a…

Spark中的宽窄依赖

一、什么是依赖关系 这里通过一张图来解释&#xff1a; result_rdd是由tuple_rdd使用reduceByKey算子得到的&#xff0c; 而tuple_rdd是由word_rdd使用map算子得到的&#xff0c;word_rdd又是由input_rdd使用flatMap算子得到的。它们之间的关系就称为依赖关系&#xff01; 二…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…

一体化运维监控管理平台详解:构建高效运维体系

在当今数字化转型的大潮中&#xff0c;IT系统的复杂性和规模不断扩大&#xff0c;运维工作的挑战也随之增加。为了应对这一挑战&#xff0c;我们推出了一体化运维监控管理平台&#xff0c;旨在通过全面、智能的监控手段&#xff0c;提升运维效率&#xff0c;保障业务连续性。本…

FBX福币交易所A股三大指数小幅低开 稀土永磁板块回调

查查配分析11月5日电 周二,A股三大指数小幅低开。沪指开盘跌0.10%报3306.81点,深证成指开盘跌0.09%报10653.20点,创业板指开盘跌0.05%报2184.90点。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 来源:同花顺iFinD 盘面…

【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)

气象数据一直是一个价值很高的数据&#xff0c;它被广泛用于各个领域的研究当中。这其中&#xff0c;又以平均气温数据最为常用&#xff01;之前我们分享过来源于美国国家海洋和大气管理局&#xff08;NOAA&#xff09;下设的国家环境信息中心(NCEI)发布的1929-2024年全球站点的…

云渲染与汽车CGI图像技术优势和劣势

在数字时代&#xff0c;云渲染技术以其独特的优势在汽车CGI图像制作中占据了重要地位。云渲染通过利用云计算的分布式处理能力&#xff0c;将渲染任务分配给云端的服务器集群进行计算&#xff0c;从而实现高效、高质量的渲染效果。 这种技术的优势主要体现在以下几个方面&#…