1.sum(a) over(partition by b order by c range/rows between d1 and d2);
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
--获取当前行和前两行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;.
range为逻辑行 rows为物理行
2.<窗口函数>的位置,可以放以下两种函数:
序号函数:row_number() / rank() / dense_rank()
分布函数:percent_rank() / cume_dist()
前后函数:lag() / lead()
头尾函数:first_val() / last_val()
其他函数:nth_value() / 用途:将分区中的有序数据分为n个桶,记录桶号。
1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
2) 聚合函数,如sum. avg, count, max, min等
3)窗口函数原则上只能写在select子句中
3.MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
4.case when then else end
1)简单Case函数 :
case 列名
when 条件值1 then 选择项1
when 条件值2 then 选项2.......
else 默认值 end
2)格式 :Case搜索函数
case
when 列名= 条件值1 then 选择项1
when 列名=条件值2 then 选项2.......
else 默认值 end
4.偏移分析函数、前后函数
向下偏移:lag(字段,偏移量【默认为1】,偏移之后出现空值的填充值)over(同窗口里面一样)
向上偏移:lead(字段,偏移量【默认为1】,偏移之后出现空值的填充值)over(同窗口里面一样)
5.ntile(n) 将窗口内的数据分成n个部分
查看2020年每个用户支付总额,并分成5个部分
select
user_name,sum_pay_amount,ntile(5) over(order by sum_pay_amount desc) nt
from
(select
distinct user_name,sum(pay_amount) over (partition by user_name) sum_pay_amount
from user_trade where year(pay_time)='2020') t;
6.分布函数
cume_dist() over() 分组内小于、等于当前rank值
percent_rank() over()
select user_name'用户',pay_amount '支付金额',pay_time '支付时间',rank() over(order by pay_amount) '排序',
round(cume_dist() over(order by pay_amount),4) '占比',
round(percent_rank() over(order by pay_amount),4) '占比'
from user_trade
where substr(pay_time,1,7)='2020-01';
7.--数学函数
select abs(1-2) '绝对值',mod(5,2) '取余',round(3.1415926,3) '四舍五入';