网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > Oracle笔记-分析函数  

Oracle笔记-分析函数

2005-12-22  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  第 12 章 分析函数

  12.1 分析函数如何工作

网管联盟bitsCN_com

  语法

中国网管联盟bitsCN.com

  FUNCTION_NAME(<参数>,…) 网管联盟bitsCN_com

  OVER

网管网www_bitscn_com

  (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC | DESC> <NULLS FIRST | NULLS LAST>> <WINDOWING子句>) 网管论坛bbs_bitsCN_com

  PARTITION子句 网管u家u.bitsCN.com

  ORDER BY子句

网管u家bitscn.net

  WINDOWING子句

网管论坛bbs_bitsCN_com

  缺省时相当于RANGE UNBOUNDED PRECEDING

网管u家u.bitscn@com

  1. 值域窗(RANGE WINDOW)

网管网www.bitscn.com

  RANGE N PRECEDING 网管联盟bitsCN@com

  仅对数值或日期类型有效,选定窗为排序后当前行之前,某列(即排序列)值大于/小于(当前行该列值 –/+ N)的所有行,因此与ORDER BY子句有关系。

网管联盟bitsCN_com

  2. 行窗(ROW WINDOW) 网管联盟bitsCN_com

  ROWS N PRECEDING

网管联盟bitsCN@com

  选定窗为当前行及之前N行。

网管下载dl.bitscn.com

  还可以加上BETWEEN AND 形式,例如RANGE BETWEEN m PRECEDING AND n FOLLOWING

网管联盟bitsCN_com

  函数 网管有家bitscn.net

  AVG(<distinct | all> expr) 网管bitscn_com

  一组或选定窗中表达式的平均值

网管网www_bitscn_com

  CORR(expr, expr) 网管u家bitscn.net

  即COVAR_POP(exp1,exp2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2)),两个表达式的互相关,-1(反相关) ~ 1(正相关),0表示不相关 网管u家u.bitsCN.com

  COUNT(<distinct> <*> <expr>)

网管下载dl.bitscn.com

  计数 网管下载dl.bitscn.com

  COVAR_POP(expr, expr) 中国网管联盟bitsCN.com

  总体协方差

网管论坛bbs_bitsCN_com

  COVAR_SAMP(expr, expr)

网管下载dl.bitscn.com

  样本协方差

网管u家u.bitscn@com

  CUME_DIST

网管u家u.bitsCN.com

  累积分布,即行在组中的相对位置,返回0 ~ 1 网管u家www.bitscn.net

  DENSE_RANK

网管下载dl.bitscn.com

  行的相对排序(与ORDER BY搭配),相同的值具有一样的序数(NULL计为相同),并不留空序数 网管联盟bitsCN_com

  FIRST_VALUE 网管下载dl.bitscn.com

  一个组的第一个值

网管论坛bbs_bitsCN_com

  LAG(expr, <offset>, <default>) 网管u家www.bitscn.net

  访问之前的行,OFFSET是缺省为1 的正数,表示相对行数,DEFAULT是当超出选定窗范围时的返回值(如第一行不存在之前行)

网管有家bitscn.net

  LAST_VALUE 网管u家u.bitsCN.com

  一个组的最后一个值

网管bitscn_com

  LEAD(expr, <offset>, <default>) 网管朋友网www_bitscn_net

  访问之后的行,OFFSET是缺省为1 的正数,表示相对行数,DEFAULT是当超出选定窗范围时的返回值(如最后行不存在之前行) 网管朋友网www_bitscn_net

  MAXexpr) 网管有家www.bitscn.net

  最大值

网管网www_bitscn_com

  MIN(expr)

网管bitscn_com

  最小值 网管论坛bbs_bitsCN_com

  NTILE(expr)

中国网管联盟bitsCN.com

  按表达式的值和行在组中的位置编号,如表达式为4,则组分4份,分别为1 ~ 4的值,而不能等分则多出的部分在值最小的那组

网管联盟bitsCN@com

  PERCENT_RANK

中国网管论坛bbs.bitsCN.com

  类似CUME_DIST,1/(行的序数 - 1) 网管u家bitscn.net

  RANK

网管网www_bitscn_com

  相对序数,允许并列,并空出随后序号

网管朋友网www_bitscn_net

  RATIO_TO_REPORT(expr) 网管u家bitscn.net

  表达式值 / SUM(表达式值) 中国网管联盟bitsCN.com

  REGR_ xxxx(expr, expr) 网管下载dl.bitscn.com

  线性回归函数

网管网www_bitscn_com

  ROW_NUMBER

网管有家bitscn.net

  排序的组中行的偏移

网管论坛bbs_bitsCN_com

  STDDEV(expr)

网管联盟bitsCN@com

  标准差 网管u家bitscn.net

  STDDEV_POP(expr) 网管联盟bitsCN_com

  总体标准差 网管有家www.bitscn.net

  STDDEV_SAMP(expr) 网管有家www.bitscn.net

  样本标准差 网管u家u.bitscn@com

  SUM(expr) 网管u家u.bitsCN.com

  合计 网管有家www.bitscn.net

  VAR_POP(expr) 网管朋友网www_bitscn_net

  总体方差 网管下载dl.bitscn.com

  VAR_SAMP(expr)

网管论坛bbs_bitsCN_com

  样本方差

网管联盟bitsCN@com

  VARIANCE(expr) 网管有家www.bitscn.net

  方差

网管u家u.bitscn@com

  12.2 例子

网管论坛bbs_bitsCN_com

  竖表转横表

网管下载dl.bitscn.com

  一般形式为将一个列为C!, C2, … CN的表,以C1, C2, … CX为基准,将CX+1, … CN的不同值改为列。一般化的语法:

网管网www.bitscn.com

  SELECT C1, C2, … CX, 网管u家bitscn.net

  MAX(DECODE(rn, 1, CX+1, NULL)) CX+1_1, … MAX(DECODE(rn, 1, CN, NULL)) CN_1

网管联盟bitsCN_com

  MAX(DECODE(rn, 2, CX+1, NULL)) CX+1_2, … MAX(DECODE(rn, 2, CN, NULL)) CN_2

网管网www.bitscn.com

  …

网管朋友网www_bitscn_net

  MAX(DECODE(rn,N,CX+1, NULL)) CX+1_N, … MAX(DECODE(rn,N, CN, NULL)) CN_N

网管论坛bbs_bitsCN_com

FROM

网管朋友网www_bitscn_net

(SELECT C1, C2, … CN,

网管u家u.bitscn@com

ROW_NUMBER() OVER (PARTITION BY C1, C2, … CX ORDER BY <something>) rn 中国网管论坛bbs.bitsCN.com

   FROM T 网管bitscn_com

   WHERE …)

网管网www.bitscn.com

GROUP BY C1, C2, … CX; 网管bitscn_com

通用包: 网管下载dl.bitscn.com

CREATE OR REPLACE PACKAGE pkg_pivot 中国网管联盟bitsCN.com

AS 网管有家www.bitscn.net

  TYPE refcursor IS REF CURSOR;

中国网管论坛bbs.bitsCN.com

  TYPE ARRAY IS TABLE OF VARCHAR2(30); 网管网www_bitscn_com

  PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT NULL, 网管u家u.bitscn@com

                  p_max_cols_query IN VARCHAR2 DEFAULT NULL,

中国网管联盟bitsCN.com

                  p_query IN VARCHAR2,

网管u家bitscn.net

                  p_anchor IN ARRAY, 网管有家bitscn.net

                  p_pivot IN ARRAY, 中国网管论坛bbs.bitsCN.com

                  p_cursor IN OUT refcursor); 网管联盟bitsCN_com

END;

网管朋友网www_bitscn_net

CREATE OR REPLACE PACKAGE BODY pkg_pivot

网管有家bitscn.net

AS

中国网管论坛bbs.bitsCN.com

  PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT NULL, 中国网管联盟bitsCN.com

                  p_max_cols_query IN VARCHAR2 DEFAULT NULL,

网管u家u.bitscn@com

                  p_query IN VARCHAR2,

网管朋友网www_bitscn_net

                  p_anchor IN ARRAY,

网管网www_bitscn_com

                  p_pivot IN ARRAY, 网管联盟bitsCN_com

                  p_cursor IN OUT refcursor) 网管有家bitscn.net

  AS 网管bitscn_com

    l_max_cols NUMBER; 网管有家www.bitscn.net

    l_query LONG; 网管u家bitscn.net

    l_cnames ARRAY;

网管u家bitscn.net

  BEGIN 网管网www_bitscn_com

    IF (p_max_cols IS NOT NULL) 网管有家bitscn.net

    THEN 网管联盟bitsCN_com

      EXECUTE IMMEDIATE p_max_cols_query INTO l_max_cols; 网管u家u.bitscn@com

    ELSE

网管网www_bitscn_com

      RAISE_APPLICATION_ERROR(-20001, 'Cannot figure out max cols');

网管联盟bitsCN@com

    END IF; 网管有家bitscn.net

    l_query := 'select '; 中国网管论坛bbs.bitsCN.com

    FOR i IN 1 .. p_anchor.count

网管下载dl.bitscn.com

    LOOP 网管联盟bitsCN@com

      l_query := l_query || p_anchor(i) || ',';

网管u家www.bitscn.net

    END LOOP;

网管bitscn_com

    FOR i IN 1 .. l_max_cols 网管网www.bitscn.com

    LOOP 网管网www_bitscn_com

      FOR j IN 1 .. p_pivot.count 网管朋友网www_bitscn_net

      LOOP

网管u家u.bitsCN.com

        l_query := l_query || 'max(decode(rn,'||i||','||p_pivot(j)||',null)) '||p_pivot(j) || '_' || i || ','; 网管u家bitscn.net

      END LOOP; 网管u家u.bitsCN.com

    END LOOP;

网管u家bitscn.net

    l_query := RTRIM(l_query,',') || ' from (' || p_query || ') group by ';

网管联盟bitsCN@com

    FOR i IN 1 .. p_anchor.count 网管有家bitscn.net

    LOOP

网管有家www.bitscn.net

      l_query := l_query || p_anchor(i) || ',';

中国网管联盟bitsCN.com

    END LOOP;

网管朋友网www_bitscn_net

    l_query := RTRIM(l_query,',');

中国网管联盟bitsCN.com

    EXECUTE IMMEDIATE 'alter session set cursor_sharing=force'; 网管论坛bbs_bitsCN_com

    OPEN p_cursor FOR l_query; 网管有家www.bitscn.net

    EXECUTE IMMEDIATE 'alter session set cursor_sharing=exact'; 网管网www_bitscn_com

  END;

网管下载dl.bitscn.com

END;

网管下载dl.bitscn.com

  其中:

网管u家bitscn.net

  p_max_cols_query为SELECT MAX(COUNT(*)) FROM TABLE_NAME GROUP BY C1, C2, … CX;

网管网www.bitscn.com

  p_query为SELECT C1, C2, … CN ROW_NUMBER() OVER (PARTITION BY C1, C2, … CX ORDER BY <something>) rn FROM TABLE_NAME;

网管u家www.bitscn.net

  p_anchor为pkg_pivot.array(C1, C2, … CX) 网管u家u.bitscn@com

  p_pivot为pkg_pivot.array(CX+1, CX+2, … CN) 网管有家www.bitscn.net

  p_cursor为返回的游标。

网管u家u.bitscn@com

  12.3 最后说明

网管bitscn_com

  PL/SQL与分析函数 网管u家www.bitscn.net

  PL/SQL不支持分析函数的语法,可以通过以下两种方法解决: 网管朋友网www_bitscn_net

  1。使用动态游标; 中国网管论坛bbs.bitsCN.com

  2。将含分析函数的语句创建为视图。

网管下载dl.bitscn.com

  WHERE子句中的分析函数 网管论坛bbs_bitsCN_com

  由于查询仅在最后的ORDER BY子句前执行分析函数,因此WHERE条件中无法使用分析函数,只能利用嵌套循环实现。 网管网www_bitscn_com

TAGs函数   分析   笔记   expr   CX   C2   rn   表达式   NULL   CN   l_query:    
 上一篇:oracle笔记-动态SQL   下一篇:sql load的一点小总结
相关文章列表
Oracle笔记-分析函数 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.PL/SQL - 嵌套游标 cursor-PLSQL
2.用一个实例讲解Oracle数据库的PL/SQL语句
3.PL/SQL----触发器-PLSQL
4.mysql存储过程写法—动态参数运用-PLSQL
5.PL/SQL Developer导出分区索引脚本-PLSQL
6.PL/SQL collection— table() 函数-PLSQL
7.SQL Server 2005 中的架构与用户-PLSQL
8.Oracle数据库维护常用SQL语句集合(2)-P
9.Oracle数据库维护常用SQL语句集合(3)-P
10.再议SQL Server临时表和表变量-PLSQL
最新推荐文章:
1.与数据库无关的处理放到数据库以外来实现
2.Oracle 10g第2版新特性之SQL和PL/SQL
3.通过PL/SQL访问Web Services
4.菜鸟学oracle - 用PL/SQL画直方图
5.重新编译PLSQL中无效对象或指定对象
6.Oracle高级技巧
7.深入了解Oracle 10g新的多重集运算符
8.在SQL中删除重复记录(多种方法)
9.Oracle:PL/SQL中怎样使用Array
10.数据库手册:速查Oracle函数列表
网管论坛交流:
·大家来开心一下吧---看了会很开心的东西-
·中国人不可不知道的知识
·@@小鹏◎◎小鹏同志与某位女明星亲密接触
·◎◎小鹏◎◎发现不明生物,居然正在交配
·[图文]^^^版主是什么?????
·泡论坛的女人是好女人
·做个“水性杨花”的女人
·献给mm俱乐部的所有mm
·深圳一集团企业电脑基础应用培训教程
·■■■■十一遊玩照■■■■■