mysql窗口函数

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) '四舍五入';

你可能感兴趣的:(mysql,数据库)