@H_404_5@
简单介绍一下Postgresql 8.4中新增功能Window函数。 |
@H_404_5@
Window函数不同于一般的集约 函数。不能像集 约 函数一 样 把复数行 输 出一行,而是复数行都能 够 保持自己的属性,不能 访问 其他行的信息。 |
@H_404_5@
语 法如下: |
@H_404_5@
function_name ([ expression [, expression ... ]]) OVER ( window_definition ) |
@H_404_5@
function_name ([ expression [, expression ... ]]) OVER window_name |
@H_404_5@
function_name ( * ) OVER ( window_definition ) |
@H_404_5@
function_name ( * ) OVER window_name |
@H_404_5@
其中window_definition部分的定义如下: |
@H_404_5@
[ existing_window_name ] |
@H_404_5@
[ PARTITION BY expression [,...] ] |
@H_404_5@
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [,...] ] |
@H_404_5@
[ frame_clause ] |
@H_404_5@
简单描述就是以下 形式 |
@H_404_5@
函数(...) OVER (PARTITION BY ...) : 区间 分割 |
@H_404_5@
函数(...) OVER (ORDER BY ...) : 每个区间 排序 |
@H_404_5@
|
@H_404_5@
通常的集约函数也能够利用。如count,sum,avg等 |
@H_404_5@
主要的Window函数如下: |
@H_404_5@
row_number():行号 |
@H_404_5@
rank():排名 (顺 序一 样 的 时 候,跳 过 番号) |
@H_404_5@
dense_rank():排名 (顺 序一 样 的 时 候,不跳 过 番号) |
@H_404_5@
percent_rank():排名 (%百分比表示) : (rank - 1) / (全行数 - 1) |
@H_404_5@
cume_dist():和percent_rank类 似 : (現在的行的位置) / (全行数) |
@H_404_5@
ntile(N):排名(1..N 分割) |
@H_404_5@
lag(value,offset,default):排序状态 的前面一行的 值 |
@H_404_5@
lead(value,default):排序状态 的后面一行的 值 |
@H_404_5@
first_value(value):最初的值 |
@H_404_5@
last_value(value):最后的值 |
@H_404_5@
nth_value(value,N):第N行的值 (行号从1开始数) |
@H_404_5@
|
@H_404_5@
例子1:每个部门 的 员 工的平均工 资 和 员 工的工 资 相比 较 |
@H_404_5@
SELECT depname,empno,salary,avg(salary) OVER (PARTITION BY depname) FROM empsalary; |
@H_404_5@
|
@H_404_5@
depname | empno | salary | avg部门平均工资 |
@H_404_5@
-----------+-------+--------+----------------------- |
@H_404_5@
develop | 11 | 5200 | 5020.0000000000000000 |
@H_404_5@
develop | 7 | 4200 | 5020.0000000000000000 |
@H_404_5@
develop | 9 | 4500 | 5020.0000000000000000 |
@H_404_5@
develop | 8 | 6000 | 5020.0000000000000000 |
@H_404_5@
develop | 10 | 5200 | 5020.0000000000000000 |
@H_404_5@
personnel | 5 | 3500 | 3700.0000000000000000 |
@H_404_5@
personnel | 2 | 3900 | 3700.0000000000000000 |
@H_404_5@
sales | 3 | 4800 | 4866.6666666666666667 |
@H_404_5@
sales | 1 | 5000 | 4866.6666666666666667 |
@H_404_5@
sales | 4 | 4800 | 4866.6666666666666667 |
@H_404_5@
(10 rows) |
@H_404_5@
|
@H_404_5@
例子2:部门员 工的工 资 排名 |
@H_404_5@
SELECT depname,rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary; |
@H_404_5@
|
@H_404_5@
depname | empno | salary | rank排名 |
@H_404_5@
-----------+-------+--------+------ |
@H_404_5@
develop | 8 | 6000 | 1 |
@H_404_5@
develop | 10 | 5200 | 2 |
@H_404_5@
develop | 11 | 5200 | 2 |
@H_404_5@
develop | 9 | 4500 | 4 |
@H_404_5@
develop | 7 | 4200 | 5 |
@H_404_5@
personnel | 2 | 3900 | 1 |
@H_404_5@
personnel | 5 | 3500 | 2 |
@H_404_5@
sales | 1 | 5000 | 1 |
@H_404_5@
sales | 4 | 4800 | 2 |
@H_404_5@
sales | 3 | 4800 | 2 |
@H_404_5@
(10 rows) |