窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。
窗口函数最重要的关键字是 partition by 和 order by
具体语法如下:XXX over (partition by xxx order by xxx)
over()里面的 partition by 和 order by 都不是必选的,over()里面可以只有partition by,也可以只有order by,也可以两个都没有,需根据需求灵活运用。
创建表
sum over (partition by xxx order by xxx)
注意:
- over()里面加 order by 表示:分组内从起点到当前行的pv累积,如,11号的pv1=10号的pv+11号的pv, 12号=10号+11号+12号;
- over()里面不加 order by 表示:将分组内所有值累加。
RANK():分组后,从1开始排名,遇到相同值会在名次中留下空位
DENSE_RANK():分组后,从1开始排名,遇到相同值不会留下空位
ROW_NUMBER(): 分组后,从1开始排名,遇到相同值按照表中记录的顺序进行排列
NTILE的使用
需求:
取数据排序后的前三分之一的数据
ntile可以看成是:把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。
就是把组内数据分成几份
创建用户访问页面表: user_url
lag
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值。
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
lead
与lag相反
LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值。
FIRST_VALUE
取分组内排序后,截止到当前行,第一个值
- LAST_VALUE的使用:
取分组内排序后,截止到当前行,最后一个值。
如果想要取分组内排序后最后一个值,则需要变通一下:
使用的是 FIRST_VALUE 的倒序取出分组内排序最后一个值!
创建员工薪水表 staff_salary
CUME_DIST:小于等于当前值的行数/分组内总行数。order默认顺序 :正序
这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时、天、月的UV数。
创建用户访问表 user_date
GROUPING SETS的使用:
grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法。
等价于将不同维度的GROUP BY结果集进行UNION ALL。
注:上述SQL中的GROUPING__ID,是个关键字,表示结果属于哪一个分组集合,根据grouping sets中的分组条件month,day,1是代表month,2是代表day。
- CUBE的使用:
根据GROUP BY的维度的所有组合进行聚合。
等价于
- ROLLUP的使用:
是CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合。
比如,以month维度进行层级聚合:
把month和day调换顺序,则以day维度进行层级聚合: