文章目录
一.简介
我个人的理解,over()就是指定了计算时如何分区,并且限定了计算的范围
1.使用步骤:
1.通过over语句以外的代码确定计算所涉及的所有数据
2.通过over里面的partition将所有数据进行分区
3.通过order里面的order把每个partition里面的数据进行排序
4.通过current now、n preceding等语句确定每行记录所对应的计算范围
5.通过over前面的函数进行计算
2.相关函数及常用关键字:
- partition by:后跟分区字段名,指定数据按照哪个变量来进行分区
- order by:后跟排序字段名,指定区内数据按照哪个变量来进行排序
- rows between…and… :指定每行记录对应的计算范围。current row当前行,n preceding往前n行,n following往后n行,unbounded preceding第一行,unbounded following最后一行。over括号内没有rows between时,默认计算范围为该行所在分区的全部;当over前面的函数支持rows between、over括号内没有rows between,但有order by时,计算范围为该行所在分区的第一行到该行。
- LAG(col,n,default_val):表示向前追溯,括号内第一个参数表示对哪个变量进行追溯,第二个参数表示往前追溯几期,最后一个参数表示前面没有记录时用什么来代替。不支持rows between
- LEAD(col,n, default_val):表示向后追溯,括号内第一个参数表示对哪个变量进行追溯,第二个参数表示往前追溯几期,最后一个参数表示后面没有记录时用什么来代替。不支持rows between
- ntile(n):把指定区域的数据分成几片。不支持rows between
以下用具体实例来介绍over的具体使用方法:
二.实例介绍
1.销售数据
原始数据:
(1)查询在2017年4月份购买过的顾客和顾客人数(同一人多次购买只算一个)
思路:
- step1:
查找4月份有购买行为的人:
select distinct(name) from business
where substring(orderdate,1,7)='2017-04';
- step2:
计算4月份一共的购买记录数
select count(distinct name) indi_total
from business
where substring(orderdate,1,7)='2017-04';
- step3:
考虑如何将这两者结合起来:over函数
select distinct name,Count(distinct name) over() indi_total
from business
where substring(orderdate,1,7)