
正文
关于postgresql排名的信息
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
PostgreSQL 高级SQL(五) 内建窗口函数
前面俩个章节我们介绍了窗口函数、滑动窗口函数的概念,接下来我们介绍一下PG支持的原生通用窗口函数,总共11个(9.6版本, 中国社区官网文档地址 )
1、row_number 函数
row_number函数可以给每隔数据行返回一个虚拟的自增ID,也就是相当于给行分配一个编号,这些编号不会出现重复,即使over()里面没有按照字段排序字段也能正常工作,
2、rank函数
rank的官方解释是:带间隙的当前行排名; 与该行的第一个同等行的row_number相同
从上面的的结果我们可以看出 rank函数和row_number一样可以将行编号,但是号码可能重复,比如我们按照年份排序,年份相同的话rank值相同,2017年的数据rank直接跳到了7,这就相当于上学的时候考试,用rank计算排名的话,如果同年级出现三个并列的第一名的话,那么计算的结果将是三个人的rank值都是第一,但是实际上的第二高的分数的同学会被rank排名为第四名,如果我们想第二高的分数的排名为2,我们可以使用dense_rank函数;
3、dense_rank函数
从上面的结果我们可以看出dense_rank函数会把编号弄得更加紧密,中间不会出现像rank那样的断层编码。
4、percent_rank函数
官方文档解释: 当前行的相对排名=(rank- 1) / (总行数 - 1) ,
排名和rank值成正相关 ,rank值相同的行号 percent_rank获取的结果也一样,返回的 结果是个小数范围在[0,1]之间 ,可以等于0或者1
5、cume_dist函数
官方文档解释: 当前行的相对排名=(rank- 1) / (总行数 - 1) ,
排名和rank值成正相关 ,rank值相同的行号 percent_rank获取的结果也一样,返回的 结果是个小数范围在[0,1]之间 ,可以等于0或者1
6、ntile函数
官方文档解释:从1到参数值的整数范围,尽可能等分分区,
ntile(num_buckets),num_buckets的值表示将结果集分成num_buckets组,有限填满前面的组,最后一组可能出现个数不足(非等分)情况,实际上就是把每隔行分个组号。
7、lag函数
官方文档解释:lag( value anyelement [, offset integer [, default anyelement ]]),返回 value , 它在分区内当前行的之前 offset 个位置的行上计算;如果没有这样的行,返回 default 替代。 (作为 value 必须是相同类型)。 offset 和 default 都是根据当前行计算的结果。如果忽略它们,则 offset 默认是1, default 默认是空值
官方文档的解释很晦涩难懂,我们直接使用用例执行一下看一下数据分布就好了
从上图可以知道当前行的lag值是当前行的前offset行的值,没有的话就返回default,default不想存在的话就返回null,从数据姐过再去看官方文档的解释的话可能清晰很多,lag函数可以在结果集的行内移动,经常使用到的场景是计算今年和全年的年产量的差值,
8、lead函数
官方文档解释:lead( value anyelement [, offset integer [, default anyelement ]]) 返回 value ,它在分区内当前行的之后 offset 个位置的行上计算;如果没有这样的行,返回 default 替代。(作为 value 必须是相同类型)。 offset 和 default 都是根据当前行计算的结果。如果忽略它们,则 offset 默认是1, default 默认是空值
其实lead函数和lag函数的作用是相同的,如果lead的offset参数值为-N,那么lag的offset的参数为N的话计算结果是相同的,lag(gdp,-1)是lead(gdp,1)的替代
9、first_value、last_value、nth_value函数较为简单不做介绍
至此我们讲完了几乎所有的窗口函数,希望这五篇关于PostgreSQL的文章能对大家在平时的开发中有所帮助
相关问答
Q1: 万洲金业跟华鑫投贵金属比较好用的是哪一家?
我选择这类型的交易平台比较看重它是否正规,而且功能是否齐全,综合考虑的话,我比较推荐华鑫投贵金属,毕竟他们拥有美国监管最严格NFA牌照,而且它的功能也是比较多的,操作起来也很方便。
Q2: 还在看编程语言排行榜?out了
StackOverflow是全球知名的程序员技术问答网站,成立于 2008年。截至目前为止,程序员平均每天在 SO上提交 8000个工作/学习中遇到的编程问题。大家都在讨论哪些技术的问题呢?这些技术历年的变化趋势又如何呢?
基于 SO从成立之初开始积累的众多技术标签/问题,SO最近推出了一个工具 Trends,使用 Trends可以实时对比技术(含编程语言)的热度。
网址:
Trends最多同时支持对比 15个技术标签的升降趋势。伯乐在线/技术最前线在下面挑选 2个常见的排行榜:TIOBE编程语言排行和 DB-Engines数据库排行。
TIOBE5月 Top 15编程语言在 SO上的变化趋势
上图就 2017年 5月来说,Top 10的编程语言技术标签如下:
JavaScript(非常明显)
Java
Python (一直处于上升状态)
PHP
C# (从09年开始处于下降状态)
C++
R
Swift
C
Ruby
其他的基本分辨不出了,这里不表
趋势查询链接:(原网址带参数太长,已缩短处理)
上图结果,和《2017年StackOverflow开发者调查》中的「热门技术」排名基本一致。
DB-Engines的 Top 15数据库在 SO上的变化趋势
上图就 2017年 5月来说,Top 5的数据库技术标签如下:
MySQL(太明显了)
SQL Server (也非常明显)
MonGoDB
Oracle或PostgreSQL(图表太小,这 2个分不清)
Oracle或PostgreSQL(图表太小,这 2个分不清)
趋势查询链接:
补充:Web服务器变化对比







