ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle over函数的学习笔记六 平均值 份额 报表函数

Oracle over函数的学习笔记六 平均值 份额 报表函数

原创 Linux操作系统 作者:lucy_lxy 时间:2011-11-02 14:14:25 0 删除 编辑

取平均值函数

AVG 返回expr的平均值.如果你指定DISTINCT, 那么你只能指定analytic_clause 的query_partition_clause. The order_by_clause 和 windowing_clause 不允许使用。

下面的例子对于employees表中的每个雇员,计算同一个经理的平均薪水,其恰好处于该雇员的前面和后面被雇佣的(该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来)。

avg函数如果不加order子句,窗口为每个partition分组内的数据记录集合,如果加了order子句,则默认窗口为rows between unbounded preceding and current row.

Kochhar  (17000+17000)/2

De haan :(17000+17000+11000)/3

Raphaely:(17000+11000+7900)/3……

SELECT manager_id, last_name, hire_date, salary,
   AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date 
   ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
   FROM employees;
MANAGER_ID LAST_NAME                 HIRE_DATE     SALARY     C_MAVG
---------- ------------------------- --------- ---------- ----------
       100 Kochhar                   21-SEP-89      17000      17000
       100 De Haan                   13-JAN-93      17000      15000
       100 Raphaely                  07-DEC-94      11000 11966.6667
       100 Kaufling                  01-MAY-95       7900 10633.3333
       100 Hartstein                 17-FEB-96      13000 9633.33333
       100 Weiss                     18-JUL-96       8000 11666.6667
       100 Russell                   01-OCT-96      14000 11833.3333
……

求份额函数:

NTILE
功能描述:将一个组分为"表达式"的散列表示,例如,如果表达式=4,则给组中的每一行分配一个数(从1到4),如果组中有20行,则给前5行分配1,给下5行分配2等等。如果组的基数不能由表达式值平均分开,则对这些行进行分配时,组中就没有任何percentile的行数比其它percentile的行数超过一行,最低的percentile是那些拥有额外行的percentile。例如,若表达式=4,行数=21,则percentile=1的有5行,percentile=2的有5行等等。
SAMPLE
:下例中把6行数据分为4份

SELECT last_name, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees
WHERE department_id = 100;

LAST_NAME   SALARY    QUARTILE
--------- ---------- ----------
Greenberg  12000    1
Faviet     9000     1
Chen       8200     2
Urman      7800     2
Sciarra    7700     3
Popp       6900     4

报表处理函数

RATIO_TO_REPORT

功能描述:该函数计算expression/(sum(expression))的值,它给出相对于总数的百分比,即当前行对sum(expression)的贡献。可以直接取得所占的份额。如果 expr 评估为null, 那么ratio-to-report的值也为空.

SAMPLE:下例计算每个员工的工资占该类员工总工资的百分比

SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
FROM employees
WHERE job_id = 'PU_CLERK';

LAST_NAME SALARY    RR
-------- ---------- ----------
Khoo       3100    .223021583
Baida      2900    .208633094
Tobias     2800    .201438849
Himuro     2600    .18705036
Colmenares 2500    .179856115

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7177735/viewspace-710103/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-09-27

  • 博文量
    124
  • 访问量
    391602