接上一篇,这一篇主要介绍三类窗口函数,分布函数、前后函数和头尾函数。

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(1)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(2)

【分布函数】

PERCENT_RANK基于RANK()函数的排序结果,percent_ranks列按照公式(rank-1) / (rows-1)带入rank值(row_num列)和rows值,其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数。

SELECT id, user_name, date, amount, RANK() OVER w as ranks, ROUND(PERCENT_RANK() OVER w,2) as percent_ranks FROM orders WINDOW w AS (PARTITION BY user_name ORDER BY amount ASC)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(3)

CUME_DIST,分组内小于等于当前rank值的行数/分组内总行数,这个函数比percen_rank使用场景更多。可以用于计算大于等于或小于等于当前订单金额的订单比例有多少。

SELECT id, user_name, date, amount, RANK() OVER w as ranks, ROUND(PERCENT_RANK() OVER w,2) as percent_ranks, ROUND(CUME_DIST() OVER w,2) as cume_dists FROM orders WINDOW w AS (PARTITION BY user_name ORDER BY amount ASC)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(4)

【前后函数】

分区中位于当前行前n行(LAG)或后n行(LEAD)的记录值。这两个函数在实际中还是有使用场景,比如要查询上一个订单距离当前订单的时间间隔,或者本条订单距离下一条订单的时间间隔。

SELECT id, user_name, date, amount, LAG(date,1) OVER w as 前一条订单时间, LEAD(date,1) OVER w as 后一条订单时间 FROM orders WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(5)

如果要计算距离上一条订单的天数,只需要增加一列,用DATEDIFF函数把两个日期相减就可以了。如果是第一条订单,就会返回空值。

SELECT id, user_name, date, amount, LAG(date,1) OVER w as 前一条订单时间, DATEDIFF(date,LAG(date,1) OVER w) 距离上一天订单天数 FROM orders WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(6)

【头尾函数】

头尾函数FIRST_VAL和LAST_VAL函数,用来得到分区中的第一个或最后一个指定参数的值。可以用来查询每个用户第一次和最后一次的订单数据信息,然后就行比较操作。需要注意的是,最后一条订单时间是基于当前订单时间来看的,所有是等于当前订单时间。

SELECT id, user_name, date, amount, first_value(date) OVER w as 第一条订单时间, last_value(date) OVER w as 最后一条订单时间 FROM orders WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(7)

End

mysql 如何查看自定义函数(MySQL窗口函数分布前后)(8)

,