PosegreSQL基础回顾(第 9 章 函数和操作符)
来源:http://www.postgres.cn/docs/11/9.7.?模式匹配?PostgreSQL提供了三种独立的实现模式匹配的方法:SQL? 9.7.1.?
|
操作符 | 描述 | 例子 |
---|---|---|
~ |
匹配正则表达式,大小写敏感 | 'thomas' ~ '.*thomas.*' |
~* |
匹配正则表达式,大小写不敏感 | 'thomas' ~* '.*Thomas.*' |
!~ |
不匹配正则表达式,大小写敏感 | 'thomas' !~ '.*Thomas.*' |
!~* |
不匹配正则表达式,大小写不敏感 | 'thomas' !~* '.*vadim.*' |
?
POSIX正则表达式提供了比LIKE
和SIMILAR TO
操作符更强大的含义。
9.21.?窗口函数
窗口函数提供在与当前查询行相关的行集合上执行计算的能力。有关这个特性的介绍请见第?3.5?节。 语法细节则请见第?4.2.8?节。
表?9.57列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数; 一个OVER
子句是必需的。
在这些函数之外,任何内建的或者用户定义的通用或者统计性聚集(即非有序集和假想集聚集)都可以被用作一个窗口函数,内建聚集的列表请见第?9.20?节。仅当聚集函数调用后面跟着一个OVER
子句时,聚集函数才会像窗口函数那样工作,否则它们会按非窗口聚集的方式运行并且为整个集合返回一个单一行。
表?9.57.?通用窗口函数
函数 | 返回类型 | 描述 |
---|---|---|
row_number() |
bigint |
当前行在其分区中的行号,从1计 |
rank() |
bigint |
带间隙的当前行排名; 与该行的第一个同等行的row_number 相同 |
dense_rank() |
bigint |
不带间隙的当前行排名; 这个函数计数同等组 |
percent_rank() |
double precision |
当前行的相对排名: (rank - 1) / (总行数 - 1) |
cume_dist() |
double precision |
累积分布:(在当前行之前或者平级的分区行数) / 分区行总数 |
ntile( |
integer |
从1到参数值的整数范围,尽可能等分分区 |
lag( |
和 |
返回value ,它在分区内当前行的之前offset 个位置的行上计算;如果没有这样的行,返回default 替代(必须和value 类型相同)。offset 和default 都是根据当前行计算的结果。如果忽略它们,则offset 默认是1,default 默认是空值 |
lead( |
和 |
返回value ,它在分区内当前行的之后offset 个位置的行上计算;如果没有这样的行,返回default 替代(必须和value 类型相同)。offset 和default 都是根据当前行计算的结果。如果忽略它们,则offset 默认是1,default 默认是空值 |
first_value( |
same type as? |
返回在窗口帧中第一行上计算的value |
last_value( |
和 |
返回在窗口帧中最后一行上计算的value |
nth_value( |
和 |
返回在窗口帧中第nth 行(行从1计数)上计算的value ;没有这样的行则返回空值 |
?
在表?9.57中列出的所有函数都依赖于相关窗口定义的ORDER BY
子句指定的排序顺序。仅考虑ORDER BY
列时不能区分的行被称为是同等行。定义的这四个排名函数(包括?cume_dist
),对于任何两个同等行的答案相同。
?
窗口帧?
这里有一个与窗口函数相关的重要概念:对于每一行,在它的分区中的行集被称为它的窗口帧。 一些窗口函数只作用在窗口帧中的行上,而不是整个分区。默认情况下,如果使用ORDER BY
,则帧包括从分区开始到当前行的所有行,以及后续任何与当前行在ORDER BY
子句上相等的行。如果ORDER BY
被忽略,则默认帧包含整个分区中所有的行。?[4]?下面是使用sum
的例子:?
SELECT salary,sum(salary) OVER () FROM empsalary;?
salary | sum --------+------- 5200 | 47100 5000 | 47100 3500 | 47100 4800 | 47100 3900 | 47100 4200 | 47100 4500 | 47100 4800 | 47100 6000 | 47100 5200 | 47100 (10 rows)?
如上所示,由于在OVER
子句中没有ORDER BY
,窗口帧和分区一样,而如果缺少PARTITION BY
则和整个表一样。换句话说,每个合计都会在整个表上进行,这样我们为每一个输出行得到的都是相同的结果。但是如果我们加上一个ORDER BY
子句,我们会得到非常不同的结果:?
SELECT salary,sum(salary) OVER (ORDER BY salary) FROM empsalary;?
salary | sum --------+------- 3500 | 3500 3900 | 7400 4200 | 11600 4500 | 16100 4800 | 25700 4800 | 25700 5000 | 30700 5200 | 41100 5200 | 41100 6000 | 47100 (10 rows)
?这里的合计是从第一个(最低的)薪水一直到当前行,包括任何与当前行相同的行(注意相同薪水行的结果)。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
- c# – 使用IEqualityComparer推荐的最佳做法是什么?
- ruby-on-rails – 如果Sidekiq未处于运行状态,则自动启动它
- VB.NET 写的一个文件转写工具(Aquilia)
- PureBasic 使用Sqlite数据库
- ruby-on-rails – 使用Stripe for rails检查是否成功充电
- ajax请求到后台的servlet类中,设置页面跳转不生效
- .net – XmlDocument混合内容漂亮打印行为的基本原理是什么
- ruby-on-rails – Rails 3:定义插件gem依赖
- ruby-on-rails – rails:与belongs_to关系的大规模分配安全
- flex用单例关闭窗口