Hello!大家好,本人菜鸟一枚,最近在领导的要求下学习Prestodb,没办法只能打开官方文档来自我学习,对于英语渣的我来说无疑是痛苦的,看到的页面和天书一样
谷歌翻译过来的吧 很多句子看不懂想要具体表达的意思
对于会SQL Server 和Oracle 数据库用过窗口函数的大神来说可以很容易的理解prestodb 中窗口函数的用法,因为几乎是一样的,但是只会mysql的我 只能四处翻资料学习,只看官方文档是不可能学会的。
声明:本文旨作为自己学习过程的笔记,以及给新手学习提供一些帮助,大神不喜勿喷,谢谢!
Proesto 官网文档地址:https://prestodb.io/docs/current/functions/window.html
(PS:学习的时候建议使用英文文档,可以参考中文文档,具体应以英文官方文档为准)
1、over (分析函数) 开窗函数over(),将聚合函数变成窗口函数来计算
包含三个分析子句: 分组(partition by),
排序(order by),
窗口(rows)
order by 对结果集排序
having 筛选分组后数据。
子句: range unbounded preceding
range between unbounded and preceding and current row 的意思是从开始到当前行的记录
range between unbounded preceding and unbouned following 的意思针对当前所有记录的前一条、后一条记录,也就是表中的所有记录。
rows between 1 preceding and current row 是指当前行的上一行(rownum-1)到当前行的汇总
--unbounded:不受控制的,无限的
--preceding:在...之前
--following:在...之后
详细可阅读:
http://www.blogjava.net/pengpenglin/archive/2008/06/25/210536.html
http://blog.csdn.net/cnham/article/details/6101199
2、排名函数:
ntile 分组/分桶函数
分组依据:
1、 每组的记录数不能大于它上一组的记录数,即编号小的桶放的记录数不能小于编号大的桶。
也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。
2、 所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记 录数都与该组(X组)的记录数相同。
每个组分得的记录条数依据:如果平均分则平均分,如果不平均,则第一组所分配的记录数为 (总条数 / 总组数)+1;剩下条数可均分则均分,如果不平均,则继续第一组分配规则
row_number 会为查询出来的每一行记录生成一个序号,依次排序且不会重复 从1开始
rank 与row_number 用法一致,但是考虑重复情况,如果字段值相同,则返回序号相同,下一条记录需要则需顺延一位,即跳跃排序,有两个第一名时接下来就是第三名
dence_rank 与rank用法一致,rank() 为跳跃排序,dence_rank() 为连续排序,即有两个第一名时接下来就是第二名
cume_dist 计算某个值在该组中的累积分布,即这个的值在改组中的相对位置返回的值范围大于0并且小于或等于1
计算方法:小于等于该行值的行数 / 总行数 (rank() 返回值就是小于等于该行值的行数)
precent_rank 用法与cume_dist类似,计算的为该行值在改组中的百分比位置
计算方法:小于等于该行值的行数 -1 / 总行数 -1
详细可阅读:
https://www.cnblogs.com/52XF/p/4209211.html
http://blog.csdn.net/leewhoee/article/details/20264609