窗口函数:破解复杂SQL查询的秘密武器
创作时间:
作者:
@小白创作中心
窗口函数:破解复杂SQL查询的秘密武器
引用
CSDN
等
11
来源
1.
https://blog.csdn.net/weixin_42698221/article/details/142631055
2.
https://blog.csdn.net/He_200988/article/details/139297098
3.
https://blog.csdn.net/weixin_50680035/article/details/138151589
4.
https://blog.csdn.net/qq_36825778/article/details/139637929
5.
https://blog.csdn.net/weixin_44512005/article/details/139477668
6.
https://blog.csdn.net/u012561308/article/details/144820274
7.
https://juejin.cn/post/7389902952700084278
8.
https://www.cnblogs.com/lubians/p/18160720
9.
https://www.alibabacloud.com/help/zh/sls/user-guide/window-functions
10.
https://juejin.cn/post/7408452427513626662
11.
https://www.xiaoyizhiqu.com/xyzq_news/article/6749b8c84ddd79f11a1e5b15
在SQL查询中,窗口函数(Window Functions)是一种强大的工具,它允许在保持数据行独立性的同时,对数据集中的行进行复杂的计算。与传统的聚合函数不同,窗口函数不会减少返回的行数,而是为每一行数据都返回一个结果。这种特性使得窗口函数在数据分析和处理中具有广泛的应用场景。
窗口函数的基本概念
窗口函数的基本语法结构如下:
<窗口函数> OVER (
[PARTITION BY column1, column2, ...]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[frame_clause]
)
- 窗口函数:如ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG()、SUM()、AVG()、MIN()、MAX()、COUNT()等。
- PARTITION BY:可选。指定分区列,将结果集分成多个分区,每个分区内的行独立计算窗口函数。如果省略,则整个结果集视为一个分区。
- ORDER BY:在大多数窗口函数中都是必需的,用于指定分区内行的排序方式。
- frame_clause:定义窗口框架,即指定窗口函数操作的行的范围。
窗口函数 vs 聚合函数
窗口函数和聚合函数在SQL查询中扮演着不同的角色:
- 聚合函数:将多条记录聚合为一条数据。它们通常用于对一组值进行计算,并返回计算后的单个值。聚合函数包括求和(SUM)、求平均数(AVG)、求最大值(MAX)、求最小值(MIN)以及计数(COUNT)等。
- 窗口函数:每条记录都会执行,有多少条数据还会返回多少条数据。窗口函数兼具分组和排序的功能,但不具备汇总功能。窗口函数可以在原表上增加字段,并在新字段上显示结果,为每一行数据都返回一个结果。
窗口函数的核心功能
窗口函数的主要功能包括:
排名和排序:
- ROW_NUMBER():为每个分区内的行提供一个唯一的序号。
- RANK():在分区内对行进行排名,相同值的行会有相同的排名,排名之间会有间隔。
- DENSE_RANK():类似于RANK(),但排名之间不会有间隔。
累积计算:
- SUM():计算分区内值的总和。
- AVG():计算分区内值的平均值。
时间序列分析:
- LEAD():获取分区内当前行的下一行的值。
- LAG():获取分区内当前行的上一行的值。
分组分析:
- NTILE():将分区内的行分成指定数量的近似相等的排名组。
- CUME_DIST():计算当前行在其分区中的累积分布位置。
- PERCENT_RANK():计算当前行的百分比排名。
实际案例分析
假设我们有一个销售数据表sales,包含sale_date(销售日期)、region(地区)和amount(销售额)。我们可以使用窗口函数来解决以下问题:
- 计算每个地区的销售额排名:
SELECT
region,
sale_date,
amount,
RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rank_in_region
FROM
sales;
这个查询会为每个地区内的销售额进行排名。
- 计算每个地区每天的累计销售额:
SELECT
region,
sale_date,
SUM(amount) OVER (PARTITION BY region ORDER BY sale_date) AS cumulative_sales
FROM
sales;
这里,我们计算了每个地区按日期排序的累计销售额。
- 使用窗口框架计算过去7天内的累计销售额:
SELECT
region,
sale_date,
SUM(amount) OVER (
PARTITION BY region
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS rolling_7_day_sales
FROM
sales;
在这个查询中,ROWS BETWEEN 6 PRECEDING AND CURRENT ROW定义了窗口框架,表示从当前行之前的6行到当前行本身,共计7天的数据用于计算累计销售额。
窗口函数是SQL中非常强大的工具,允许你在保持数据行独立性的同时,对数据集中的行进行复杂的计算。通过合理使用分区、排序和窗口框架,你可以解决许多复杂的数据分析问题。
热门推荐
愿天下无拐!这份防拐指南,家长和孩子一定要记住!
深度丨青春疼痛文学IP分化史
玛丽·布莱尔的浣熊艺术插图:水彩与民间艺术的完美融合
十个关于酒的历史典故:酒,不仅仅是饮料!
银屑病如何用药?联合用药效果好
我国历次个税起征点调整及平均工资水平(单位:元)
一天要吃掉一万五千斤粮食!井冈山根据地是如何被毛泽东盘活的?
乌克兰与俄罗斯有何历史渊源?
退出美国、加拿大国籍,百亿富翁带着全部身家加入了中国国籍
大清出现最后一次回光返照同光中兴的原因
汽车整车设计与产品开发
悼词应该怎么写
浣熊:一种机灵可爱的夜行性动物
浣熊:一种机灵可爱的野生动物
给“扮演蒋介石”的10位演员排座次:王劲松第9,陈道明第8
为什么那些“不完美”的人往往更少内耗?
宸字的含义是什么
《哪吒2》西海龙王敖闰,裂空爪划破国漫天花板,姐才是龙族顶流!
热火训练营揭秘:奥尼尔体重变化背后的故事!经典NBA回顾
股四头肌训练10套最佳动作
母凭女贵:一个跨越古今的社会现象
关注患者心理状态,构建人性化医疗关怀体系
正念练习有助于改善儿童注意力不足
长跑运动员的腿为什么那么细?
嬴政和芈月是什么关系?两人血缘相隔甚远(祖宗辈)
独特的纳西族摩梭人:全村人“不嫁不娶”,走婚习俗实现自由繁衍
百变工程天文望远镜课件
动脉硬化十大理疗药物
穴位按摩真的可以治病吗
中国古代四大才子:才华横溢的文人墨客