oracle分析函数等高级sql.docx

上传人:b****6 文档编号:8387869 上传时间:2023-01-31 格式:DOCX 页数:30 大小:28.26KB
下载 相关 举报
oracle分析函数等高级sql.docx_第1页
第1页 / 共30页
oracle分析函数等高级sql.docx_第2页
第2页 / 共30页
oracle分析函数等高级sql.docx_第3页
第3页 / 共30页
oracle分析函数等高级sql.docx_第4页
第4页 / 共30页
oracle分析函数等高级sql.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

oracle分析函数等高级sql.docx

《oracle分析函数等高级sql.docx》由会员分享,可在线阅读,更多相关《oracle分析函数等高级sql.docx(30页珍藏版)》请在冰豆网上搜索。

oracle分析函数等高级sql.docx

oracle分析函数等高级sql

Oracle9i分析函数参考手册

    Oracle从开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/来创建。

    少数几个例子需要访问SH用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/sales_history/来创建。

    如果未指明缺省是在HR用户下运行例子。

    开窗函数的的理解:

    开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:

over(orderbysalary)按照salary排序进行累计,orderby是个默认的开窗函数

over(partitionbydeptno)按照部门分区

over(orderbysalaryrangebetween50precedingand150following)

每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150

over(orderbysalaryrowsbetween50precedingand150following)

每行对应的数据窗口是之前50行,之后150行

over(orderbysalaryrowsbetweenunboundedprecedingandunboundedfollowing)

每行对应的数据窗口是从第一行到最后一行,等效:

over(orderbysalaryrangebetweenunboundedprecedingandunboundedfollowing)

主要参考资料:

《expertone-on-one》TomKyte  《Oracle9iSQLReference》第6章

 

AVG

功能描述:

用于计算一个组和数据窗口内表达式的平均值。

SAMPLE:

下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告,该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来;

SELECTmanager_id,last_name,hire_date,salary,

  AVG(salary)OVER(PARTITIONBYmanager_idORDERBYhire_date

  ROWSBETWEEN1PRECEDINGAND1FOLLOWING)ASc_mavg

  FROMemployees;

MANAGER_IDLAST_NAME            HIRE_DATE    SALARY    C_MAVG

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

    100Kochhar            21-SEP-89    17000    17000

    100DeHaan            13-JAN-93    17000    15000

    100Raphaely            07-DEC-94    11000

    100Kaufling            01-MAY-95    7900

    100Hartstein            17-FEB-96    13000

    100Weiss              18-JUL-96    8000

    100Russell            01-OCT-96    14000

.

.

.

 

CORR

功能描述:

返回一对表达式的相关系数,它是如下的缩写:

      COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))

      从统计上讲,相关性是变量之间关联的强度,变量之间的关联意味着在某种程度

      上一个变量的值可由其它的值进行预测。

通过返回一个-1~1之间的一个数,相关

      系数给出了关联的强度,0表示不相关。

SAMPLE:

下例返回1998年月销售收入和月单位销售的关系的累积系数(本例在SH用户下运行)

SELECT,

    CORR(SUM,SUM)

    OVER(ORDERBYasCUM_CORR

  FROMsaless,timest

WHERE=ANDcalendar_year=1998

GROUPBY

ORDERBY;

CALENDAR_MONTH_NUMBER  CUM_CORR

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

              1

              2      1

              3.2

              4.5

              5.4

              6.8

              7.3

              8.9

              9.6

            10  .

            11.5

            12.2

 

COVAR_POP  

功能描述:

返回一对表达式的总体协方差。

SAMPLE:

下例CUM_COVP返回定价和最小产品价格的累积总体协方差

SELECTproduct_id,supplier_id,

      COVAR_POP(list_price,min_price)

      OVER(ORDERBYproduct_id,supplier_id)ASCUM_COVP,

      COVAR_SAMP(list_price,min_price)

      OVER(ORDERBYproduct_id,supplier_id)ASCUM_COVS

  FROMproduct_informationp

WHEREcategory_id=29

ORDERBYproduct_id,supplier_id;

PRODUCT_IDSUPPLIER_ID  CUM_COVP  CUM_COVS

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

    1774    103088      0

    1775    103087      

    1794    103096

    1825    103093  

    2004    103086      

    2005    103086        1815

    2416    103088

.

.

 

COVAR_SAMP  

功能描述:

返回一对表达式的样本协方差

SAMPLE:

下例CUM_COVS返回定价和最小产品价格的累积样本协方差

SELECTproduct_id,supplier_id,

      COVAR_POP(list_price,min_price)

      OVER(ORDERBYproduct_id,supplier_id)ASCUM_COVP,

      COVAR_SAMP(list_price,min_price)

      OVER(ORDERBYproduct_id,supplier_id)ASCUM_COVS

  FROMproduct_informationp

WHEREcategory_id=29

ORDERBYproduct_id,supplier_id;

PRODUCT_IDSUPPLIER_ID  CUM_COVP  CUM_COVS

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

    1774    103088      0

    1775    103087      

    1794    103096

    1825    103093  

    2004    103086      

    2005    103086        1815

    2416    103088

.

.

 

COUNT

功能描述:

对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。

SAMPLE:

下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水

例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数

SELECTlast_name,salary,COUNT(*)OVER()AScnt1,

    COUNT(*)OVER(ORDERBYsalary)AScnt2,

    COUNT(*)OVER(ORDERBYsalaryRANGEBETWEEN50PRECEDING

    AND150FOLLOWING)AScnt3FROMemployees;

LAST_NAME              SALARY    CNT1    CNT2    CNT3

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

Olson                  2100      107      1      3

Markle                  2200      107      3      2

Philtanker              2200      107      3      2

Landry                  2400      107      5      8

Gee                    2400      107      5      8

Colmenares              2500      107      11      10

Patel                  2500      107      11      10

.

.

 

CUME_DIST

功能描述:

计算一行在组中的相对位置,CUME_DIST总是返回大于0、小于或等于1的数,该数表示该行在N行中的位置。

例如,在一个3行的组中,返回的累计分布值为1/3、2/3、3/3

SAMPLE:

下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比

SELECTjob_id,last_name,salary,CUME_DIST()

    OVER(PARTITIONBYjob_idORDERBYsalary)AScume_dist

  FROMemployees  WHEREjob_idLIKE'PU%';

JOB_ID    LAST_NAME              SALARY  CUME_DIST

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

PU_CLERK  Colmenares              2500      .2

PU_CLERK  Himuro                  2600      .4

PU_CLERK  Tobias                  2800      .6

PU_CLERK  Baida                  2900      .8

PU_CLERK  Khoo                  3100      1

PU_MAN    Raphaely                11000      1

 

DENSE_RANK

功能描述:

根据ORDERBY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。

组内的数据按ORDERBY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。

每次ORDERBY表达式的值发生变化时,该序列也随之增加。

有同样值的行得到同样的数字序号(认为null时相等的)。

密集的序列返回的时没有间隔的数

SAMPLE:

下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与RANK函数的区别)

SELECT,,,DENSE_RANK()

      OVER(PARTITIONBYORDERBYasdrank

  FROMemployeese,departmentsd

WHERE=

  ANDIN('60','90');

DEPARTMENT_IDLAST_NAME              SALARY    DRANK

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

        60Lorentz                4200      1

        60Austin                  4800      2

        60Pataballa                4800      2

        60Ernst                  6000      3

        60Hunold                  9000      4

        90Kochhar                17000      1

        90DeHaan                17000      1

        90King                  24000      2

 

FIRST

功能描述:

从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

SAMPLE:

下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值

SELECTlast_name,department_id,salary,

      MIN(salary)KEEP(DENSE_RANKFIRSTORDERBYcommission_pct)

      OVER(PARTITIONBYdepartment_id)"Worst",

      MAX(salary)KEEP(DENSE_RANKLASTORDERBYcommission_pct)

      OVER(PARTITIONBYdepartment_id)"Best"

  FROMemployees

WHEREdepartment_idin(20,80)

ORDERBYdepartment_id,salary;

LAST_NAME            DEPARTMENT_ID    SALARY    Worst    Best

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

Fay                      20    6000    6000    13000

Hartstein                  20    13000    6000    13000

Kumar                      80    6100    6100    14000

Banda                      80    6200    6100    14000

Johnson                    80    6200    6100    14000

Ande                      80    6400    6100    14000

Lee                      80    6800    6100    14000

Tuvault                    80    7000    6100    14000

Sewall                    80    7000    6100    14000

Marvins                    80    7200    6100    14000

Bates                      80    7300    6100    14000

.

.

.

 

FIRST_VALUE  

功能描述:

返回组中数据窗口的第一个值。

SAMPLE:

下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字,如果薪水的第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字

SELECTdepartment_id,last_name,salary,FIRST_VALUE(last_name)

  OVER(PARTITIONBYdepartment_idORDERBYsalaryASC)ASlowest_sal

  FROMemployees

WHEREdepartment_idin(20,30);

DEPARTMENT_IDLAST_NAME              SALARYLOWEST_SAL

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

        20Fay                    6000Fay

        20Hartstein              13000Fay

        30Colmenares              2500Colmenares

        30Himuro                  2600Colmenares

        30Tobias                  2800Colmenares

        30Baida                  2900Colmenares

        30Khoo                  3100Colmenares

        30Raphaely                11000Colmenares

 

LAG

功能描述:

可以访问结果集中的其它行而不用进行自连接。

它允许去处理游标,就好像游标是一个数组一样。

在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。

Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行),其相反的函数是LEAD

SAMPLE:

下面的例子中列prev_sal返回按hire_date排序的前1行的salary值

SELECTlast_name,hire_date,salary,

    LAG(salary,1,0)OVER(ORDERBYhire_date)ASprev_sal

  FROMemployees

WHEREjob_id='PU_CLERK';

LAST_NAME            HIRE_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1