Oracle从开始提供分析函数分析函数用于计算基于组的某种聚合值它和聚合函数的不同之处是对于每个组返回多行而聚合函数对于每个组只返回一行
下面例子中使用的表来自Oracle自带的HR用户下的表如果没有安装该用户可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/hr_mainsql来创建
少数几个例子需要访问SH用户下的表如果没有安装该用户可以在SYS用户下运行$ORACLE_HOME/demo/schema/sales_history/sh_mainsql来创建
如果未指明缺省是在HR用户下运行例子
开窗函数的的理解
开窗函数指定了分析函数工作的数据窗口大小这个数据窗口大小可能会随着行的变化而变化举例如下
over(order by salary) 按照salary排序进行累计order by是个默认的开窗函数
over(partition by deptno)按照部门分区
over(order by salary range between preceding and following)
每行对应的数据窗口是之前行幅度值不超过之后行幅度值不超过
over(order by salary rows between preceding and following)
每行对应的数据窗口是之前行之后行
over(order by salary rows between unbounded preceding and unbounded following)
每行对应的数据窗口是从第一行到最后一行等效
over(order by salary range between unbounded preceding and unbounded following)
主要参考资料《expert oneonone》 Tom Kyte《Oraclei SQL Reference》第章
AVG
功能描述用于计算一个组和数据窗口内表达式的平均值
SAMPLE下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来
SELECT manager_id last_name hire_date salary
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
ROWS BETWEEN PRECEDING AND FOLLOWING) AS c_mavg
FROM employees;
MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG
Kochhar SEP
De Haan JAN
RaphaelyDEC
KauflingMAY
Hartstein FEB
Weiss JUL
Russell OCT
CORR
功能描述返回一对表达式的相关系数它是如下的缩写
COVAR_POP(exprexpr)/STDDEV_POP(expr)*STDDEV_POP(expr))从统计上讲相关性是变量之间关联的强度变量之间的关联意味着在某种程度上一个变量的值可由其它的值进行预测通过返回一个~之间的一个数 相关系数给出了关联的强度表示不相关
SAMPLE下例返回年月销售收入和月单位销售的关系的累积系数(本例在SH用户下运行)
SELECT tcalendar_month_number
CORR (SUM(samount_sold) SUM(squantity_sold))
OVER (ORDER BY tcalendar_month_number) as CUM_CORR
FROM sales s times t
WHERE stime_id = ttime_id AND calendar_year =
GROUP BY tcalendar_month_number
ORDER BY tcalendar_month_number;
CALENDAR_MONTH_NUMBER CUM_CORR
COVAR_POP
功能描述返回一对表达式的总体协方差
SAMPLE下例CUM_COVP返回定价和最小产品价格的累积总体协方差
SELECT product_id supplier_id
COVAR_POP(list_price min_price)
OVER (ORDER BY product_id supplier_id) AS CUM_COVP
COVAR_SAMP(list_price min_price)
OVER (ORDER BY product_id supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id =
ORDER BY product_id supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
COVAR_SAMP
功能描述返回一对表达式的样本协方差
SAMPLE下例CUM_COVS返回定价和最小产品价格的累积样本协方差
SELECT product_id supplier_id
COVAR_POP(list_price min_price)
OVER (ORDER BY product_id supplier_id) AS CUM_COVP
COVAR_SAMP(list_price min_price)
OVER (ORDER BY product_id supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id =
ORDER BY product_id supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
COUNT
功能描述对一组内发生的事情进行累积计数如果指定*或一些非空常数count将对所有行计数如果指定一个表达式count返回表达式非空赋值的计数当有相同值出现时这些相等的值都会被纳入被计算的值可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数
SAMPLE下面例子中计算每个员工在按薪水排序中当前行附近薪水在[nn+]之间的行数n表示当前行的薪水
例如Philtanker的薪水排在他之前的行中薪水大于等于的有行排在他之后的行中薪水小于等于+的行没有所以count计数值cnt为(包括自己当前行)cnt值相当于小于等于当前行的SALARY值的所有行数
SELECT last_name salary COUNT(*) OVER () AS cnt
COUNT(*) OVER (ORDER BY salary) AS cnt
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN PRECEDING
AND FOLLOWING) AS cnt FROM employees;
LAST_NAME SALARY CNT CNT CNT
Olson
Markle
Philtanker
Landry
Gee
Colmenares
Patel
CUME_DIST
功能描述计算一行在组中的相对位置CUME_DIST总是返回大于小于或等于的数该数表示该行在N行中的位置例如在一个行的组中返回的累计分布值为///
SAMPLE下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比
SELECT job_id last_name salary CUME_DIST()
OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist
FROM employeesWHERE job_id LIKE PU%;
JOB_ID LAST_NAME SALARYCUME_DIST
PU_CLERK Colmenares
PU_CLERK Himuro
PU_CLERK Tobias
PU_CLERK Baida
PU_CLERK Khoo
PU_MAN Raphaely
DENSE_RANK
功能描述根据ORDER BY子句中表达式的值从查询返回的每一行计算它们与其它行的相对位置组内的数据按ORDER BY子句排