05窗口函数
本文最后更新于 2021-08-05 11:42:59
窗口函数
简介
oracle,sqlserver以及mysql8.x+都支持窗口函数
窗口:函数运行时的计算数据集范围
函数:运行的函数
- 统计类函数
- min
- max
- avg
- sum
- count
- windowing functions
- LEAD
LEAD(scalar_expression [,offset] [,default])返回当前行一下N行指定列(scalar_expression )的值,找不到采用默认值 - LAG
LAG(scalar_expression [,offset] [,default])返回当前行以上N行的指定列的列值,如果找不到,就采用默认值 - FIRST_VALUE:
FIRST_VALUE(列名,[false(默认)])返回当前窗口指定列的第一个值,第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找! - LAST_VALUE:
LAST_VALUE(列名,[false(默认)])返回当前窗口指定列的最后一个值,第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找!
- LEAD
- 排名分析函数
- RANK:允许并列,一旦有并列跳号!
- ROW_NUMBER:行号! 连续的,每个号之间差1!
- DENSE_RANK:允许并列,一旦有并列不跳号!
- CUME_DIST:从排序后的第一行到当前值之间数据 占整个数据集的百分比!
- PERCENT_RANK: rank-1/ 总数据量-1
- NTILE: 将数据集均分到X个组中,返回每条记录所在的组号
格式:函数 over( partition by 字段 ,order by 字段 window_clause )
window_clause :
1 | |
窗口函数和分组有什么区别?
- 如果是分组操作,select后只能写分组后的字段
- 如果是窗口函数,窗口函数是在指定的窗口内,对每条记录都执行一次函数
- 如果是分组操作,有去重效果,而partition不去重!
Demo windowing functions
准备数据
数据
1 | |
创建表&导入数据
1 | |
查询在2019年4月份购买过的顾客及总人数
1 | |
查询顾客的购买明细及月购买总额
1 | |
查询顾客的购买明细要将cost按照日期进行累加
1 | |
查询顾客的购买明细及顾客上次的购买时间
1 | |
查询顾客的购买明细及顾客本月第一次购买的时间
1 | |
查询顾客的购买明细及顾客最近三次cost花费
1 | |
查询前20%时间的订单信息
1 | |
Demo 排名函数
准备数据
1 | |
按照科目进行排名
1 | |
给每个学生的总分进行排名
1 | |
求每个学生的成绩明细及给每个学生的总分和总分排名
1 | |
只查询每个科目的成绩的前2名
1 | |
查询学生成绩明细,并显示当前科目最高分
1 | |
05窗口函数
https://jiajun.xyz/2020/10/21/bigdata/02hive/05窗口函数/