SQL 窗口函数 ( window function )

嗯...SQL...窗口函数...这是一个东西...相当麻烦...但有时...它非常有用...
听...在2 02 2 年...我在一家公司...使用SQL来处理数据...这个窗口函数...只是...允许你对一个组进行一些计算...但它不是聚合...
例如...说到排名...它在类表中...按性能排名...我知道...使用它排名...排名...但是...想关于这个...如果两个人得分相同...排名会漏掉一个人...下一个会立即变成第三...很烦人...
后来...我又尝试了Density_rank...还好...不会漏掉...只是平局...他们都给出相同的排名...那就...好一点...
还有row_number...更容易...不管你的分数是多少...按顺序排名...逐一数...没关系你的分数高不高...或者不高...很简单...
然后...说一下TOPN...比如说...我想找出每个学生...两门成绩最高的科目...那...不容易做到...
当时我想了很久...最后用row_number...或者rank...加上一个"where"子句...先排序...然后在"where...中选择那些排名小于或等于2 的...退出...
这个...窗口函数...很有用...
而且...例如sum...或者avg...也可以用作窗口函数...例如...我想计算...每个员工的总工资...或者...每个学生的GPA...
这个...需要使用窗口函数...把sum或avg...用...然后...匹配子句over...定义窗口...
然后...我们说一个实际的场景...例如...你想计算...累计总和...或者...移动平均值...
比如...我之前在分析...一家公司的业绩...用窗口函数...计算累计业绩..
还有...比如监控...确诊病例数的累计数据...也用这个...
这个存储过程...不一样...不是窗口函数...
存储过程...只是...预先写好的一段SQL代码...你可以...存储它...然后...直接调用他...每次调用他。
使用...
例如...我定义...一个存储过程...来测试...某个学区政党的表现...
它...一个存储过程...不是一个窗口函数...
所以...一个窗口函数...被设计...对分组数据进行动态计算...这很麻烦...但是很有用...
就是这样...

sql进阶函数之分区函数over的用法

我记得有一次,当我在一家大公司担任数据分析师时,我手头有一个数据库,可以存储数千名学生的表现信息。
我需要根据这些信息对每门课程的每个学生进行评分,以便学校了解学生的教育情况。
那是周末,我坐在办公室里盯着电脑屏幕思考如何高效地完成这项任务。

我的第一个想法是使用rank()函数,因为它似乎适合我的需要。
我编写了一个 SQL 查询并使用了像Rank()over(partitionby school number by rowrank)这样的语句。
结果很快就出来了,我惊喜地发现每个学生对每门课程都得到了相似的评分。
然而,当我仔细查看结果时,我发现有些排名存在差距,即有些排名不连续。

我皱起眉头,这显然不是我想要的效果。
所以,我决定尝试 Density_rank()。
我修改了SQL语句,改用Density_rank()函数,然后再次执行查询。
我对这次的结果比较满意。
世界排名没有差距,每个排名都是连续的。

然后我突然想到,如果一个学生同时在两门课程中获得最高分,那么根据rank()规则,他的排名可能会被跳过。
这显然不是我想要的结果。
因此,我尝试使用row_number()而不是rank()来确保即使学生并列第一名,也只会记录一个排名。

那天晚上,我花了很多时间调试SQL语句,终于得到了满意的结果。
我看着屏幕上整齐的排行榜,暗自庆幸自己遇到了这些分析功能。
除此之外,我实在不知道要花多少时间和精力才能完成这个任务。

现在回想起来,那次周末的经历让我对SQL的分析功能有了更深入的了解。
不过,我还是有点好奇。
如果有一天我们能够开发出更智能的分析工具,这些传统的 SQL 函数还会如此重要吗?

SQL进阶-开窗函数() over(partition by)

窗口函数是一个SQL优化工具。
1 0年的经验告诉我,用得好,效果会加倍。

窗口排序,如TopN,使用rank()或densis_rank(),按城市分组,按价格排序,简单!
聚合窗口,如平均值、SUM()、AVG()等,移动平均线也不是问题。

记住语法:窗口函数()OVER(按列名顺序分区),这个公式没有错。

例子?前2 个城市的价格,加一层子查询,排名过滤,直接获取。

总结?窗口函数是SQL中提高效率的绝活技巧。

SQL中累计求和与滑动求和函数sum() over()用法

2 02 3 年,我的一个朋友询问SQL sum()函数的高级功能,我给他举了一个例子。

上周我向他展示了表 dws_js_team_gmv,其中包含团队名称、月份和营业额。

首先,他要计算每个销售部门每年的总营业额及其对总价值的贡献。
这一要求可以通过跨组求和并存储当前行数来实现。
我给他写了这段 SQL 代码:
sql SELECT team_name、月份、金额(sales_volume)(SECTION BY team_name ORDER BY Month)作为total_sales, (sum(sales_amount) over ()
sum(sales_amount) over (SECTION BY 命令名称 ORDER BY Month)) / sum(sales_amount) over () 作为贡献系数 作者:dws_js_team_gmv;
然后他问如何记录这个月的累计生产力。
这也是存储当前行的组总和。
代码如下:
sql 选择(SECTION BY team_name ORDER BY Month)的团队名称、月份、金额(销售额)作为总销售额 作者:dws_js_team_gmv;
最后,他希望看到过去三个月的累计数据,其中包括滚动总数。
我写了以下代码:
sql 选择团队名称、月份、金额(销售额)(按月份排序,范围介于 2 PREVIOUS 1 NEXT 之间)作为 Three_month_cumulative_sales 作者:dws_js_team_gmv;
对于最近三个月(不包括统计月份)的合计,有三种处理方法。
我向他解释:
1 减去统计月份值并计算最近四个月的滚动总计。
2 .将滑动幅度从前3 个月调整为前2 个月。
3 、或者从前3 个月调整到下一个月。

所有这些代码都演示了 sum() over() 函数在各种场景下的使用,可以帮助其灵活处理累积和滚动求和需求。
闻言,他似乎明白了,没有再说什么。
算了,他可能觉得这太难了。