一、窗口函数说明
1.窗口函数的语句结构
- 窗口函数的语法格式
函数名 ([expr]) over(子句)
函数名 ([expr]) over( partition by <要分列的组> order by <要排序的列> rows between <数据范围>)
其中over关键字后子句包含三个分析子句
分组子句partition by
排序子句order by
窗口子句rows
sum A over (partition by B order by C rows between D1 and D2)
avg A over(partition by B order by C rows between D1 and D2)
- rows子句的相关示例
rows between 2 preceding and current row # 取当前行和前面两行
rows between unbounded preceding and current row # 包括本行和之前所有的行
rows between current row and unbounded following # 包括本行和之后所有的行
rows between 3 preceding and 1 following # 取前面三行和下面一行,包含当前行,总共五行
注意:
当order by后面缺少窗口从句条件,窗口规范默认是rows between unbounded preceding and current row.
当order by和窗口从句都缺失, 窗口规范默认是 rows between unbounded preceding and unbounded following
2.窗口函数的分类
- 窗口函数分为两种
专用窗口函数 | 聚合类窗口函数 |
---|---|
rank() 并列排名会跳号 | sum() |
dense_rank() 并列排名不会跳号 | count() |
row_number() 生成行的编号 | avg() |
max() | |
min() |
二、案例分析(电商平台订单信息)
1.数据准备
表结构
列名 | 释义 |
---|---|
user_name | 用户名 |
piece | 购买数量 |
price | 价格 |
pay_amount | 支付金额 |
goods_category | 商品品类 |
pay_time | 支付日期 |
建表语句
use lagou;
create table user_trade (
user_name varchar(20),
piece int,
price double,
pay_amount double,
goods_category varchar(20),
pay_time date
);
2.窗口函数之累计计算函数
需求1: 查询出2019年每月的支付总额和当年累积支付总额
-- step1 过滤出2019年数据
select * from user_trade where year(pay_time)=2019;
-- st