函数postgresql的简单介绍

postgresql里有没有像oracle中的那类分析函数

有的。PostgreSQL内建有分析函数,PostgreSQL称之为Window Function,有如下这些:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、网络空间、营销软件、网站建设、扎赉特网站维护、网站推广。

row_number()

rank()

dense_rank()

percent_rank()

cume_dist()

ntile(num_buckets integer)

lag(value any [, offset integer [, default any ]])

lead(value any [, offset integer [, default any ]])

first_value(value any)

last_value(value any)

nth_value(value any, nth integer)

具体说明参看PostgreSQL说明文件中Funcstions Operates下的Winow Functions。

postgresql的"函数"怎么导出脚本

两种方法:

方法一:查询pg_proc:

osdba=# select prosrc from pg_proc where proname='get_username';

prosrc

--------------------------------------------------------

declare

ret text;

begin

SELECT name into ret from tang01 where id=userid;

return ret;

end;

(1 row)

方法二:调用pg_catalog.pg_get_functiondef函数:

osdba=# select pg_get_functiondef('get_username'::regproc);

pg_get_functiondef

----------------------------------------------------------------

CREATE OR REPLACE FUNCTION public.get_username(userid integer)

RETURNS text

LANGUAGE plpgsql

AS $function$

declare

ret text;

begin

SELECT name into ret from tang01 where id=userid;

return ret;

end;

$function$

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的文章能对大家在平时的开发中有所帮助

postgresql----数组类型和函数

postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

示例1.使用ARRAY构建数组类型

---1*4的一维数组test=#selectarray[1,2,3,4];

array  -----------{1,2,3,4}

(1 row)--2*2的二维数组test=#selectarray[[1,2],[3,4]];

array    ---------------{{1,2},{3,4}}

(1 row)--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];

        array            -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}

(1row)

示例2.创建一张表,字段包含数组类型

其中int[]表示数组长度无限制,int[4]表示数组长度为4.

test=#createtabletbl_array(aint[],bvarchar(32)[][],cint);CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1);INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2);INSERT01test=#select*from tbl_array ;

a    |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)

test=#selecta[1],b[2]fromtbl_arraywherec=1;

a | b ---+---1|

(1 row)

test=#selecta[1],b[2][1]fromtbl_arraywherec=1;

a | b ---+---1|4(1 row)

test=#selecta[1],b[2][4]fromtbl_arraywherec=1;

a | b ---+---1|

(1row)

test=#updatetbl_arrayseta[1]=200wherea[1]=1;UPDATE1test=#selecta[1],b[2][4]from tbl_array ;

a  | b -----+---100|200|

(2rows)

也可以使用[下标:上标]方式来查询数组连续的某些元素。

test=#selecta[2:3]from tbl_array ;

a  -------{2}

{2,3}

(2 rows)

test=#selecta[1:3]from tbl_array ;

a    -----------{100,2}

{200,2,3}

(2rows)

数组操作符与函数

操作符

操作符描述示例结果

=相等 SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3]; t

不等于 select ARRAY[1,2,3] ARRAY[1,2,4]; t

小于 select ARRAY[1,2,3] ARRAY[1,2,4]; t

大于 select ARRAY[1,4,3] ARRAY[1,2,4]; t

=小于或等于 select ARRAY[1,2,3] = ARRAY[1,2,3]; t

=大于或等于 select ARRAY[1,4,3] = ARRAY[1,4,3]; t

@包含 select ARRAY[1,4,3] @ ARRAY[3,1]; t

@包含于 select ARRAY[2,7] @ ARRAY[1,7,4,2,6]; t

重叠(是否有相同元素) select ARRAY[1,4,3] ARRAY[2,1]; t

||数组与数组连接 select ARRAY[1,2,3] || ARRAY[4,5,6]; {1,2,3,4,5,6}

||数组与数组连接 select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]; {{1,2,3},{4,5,6},{7,8,9}}

||元素与数组连接 select 3 || ARRAY[4,5,6]; {3,4,5,6}

||数组与元素连接 select ARRAY[4,5,6] || 7; {4,5,6,7}

函数

函数返回类型描述示例结果

array_append(anyarray,anyelement)anyarray 在数组末尾追加元素 

SELECT array_append(ARRAY[1,2], 3);

{1,2,3}

array_cat(anyarray,anyarray)anyarray 连接两个数组 SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]); {1,2,3,4,5}

array_ndims(anyarray)int 返回数组维数 SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]); 2

array_dims(anyarray)text 返回数组维数的文本表示 SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]); [1:2][1:3]

array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和维度初始化一个数组,其中anyelement是值,第一个int[]是数组的长度,第二个int[]是数组下界,下界默认是1 SELECT array_fill(7, ARRAY[3], ARRAY[2]); [2:4]={7,7,7}

array_length(anyarray,int)int 返回数组指定维度的长度 SELECT array_length(array[1,2,3], 1); 3

array_lower(anyarray,int)int 返回数组指定维度的下界 SELECT array_lower('[0:2]={1,2,3}'::int[], 1); 0

array_position(anyarray,anyelement[,int])int 返回数组元素anyelement从数组的[,int]位置(默认为1)开始第一次出现在数组中的位置,数组必须是一维的 SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon'); 2

array_positions(anyarray,anyelement)int[] 返回元素在数组中的所有位置 SELECT array_positions(ARRAY['A','A','B','A'], 'A'); {1,2,4}

array_prepend(anyelement,anyarray)anyarray 在数组开头添加新的元素 SELECT array_prepend(1, ARRAY[2,3]); {1,2,3}

array_remove(anyarray,anyelement)anyarray 从数组中删除所有的指定元素,必须是一维数组 SELECT array_remove(ARRAY[1,2,3,2], 2); {1,3}

array_replace(anyarray,anyelement,anyelement)anyarray 替换指定数组元素为新的元素 SELECT array_replace(ARRAY[1,2,5,4], 5, 3); {1,2,3,4}

array_to_string(anyarray,text[,text])text 将数组元素使用分隔符连接为文本,NULL可以使用指定元素替换 SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*'); 1,2,3,*,5

array_upper(anyarray,int)int 数组指定维度的上届 SELECT array_upper(ARRAY[1,8,3,7], 1); 4

cardinality(anyarray)int 返回数组所有维度的长度总和,如果是空数组则返回0 SELECT cardinality(ARRAY[[1,2],[3,4]]); 4

string_to_array(text,text[,text])text[] 将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULL SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy'); {xx,NULL,zz}

unnest(anyarray)setof anyelement 将数组元素转换为行 SELECT unnest(ARRAY[1,2]); 

1

2

unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...] 将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用 SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']); 

unnest | unnest

--------+----

1 | foo

2 | bar

| baz


分享题目:函数postgresql的简单介绍
当前链接:http://pwwzsj.com/article/dscscsj.html