Oracle over函数的学习笔记四 计数和取相对行函数

计数函数:

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

下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行 $ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。少数几个例子需要访问SH用户下的表,如果没有安装该用户,可以在SYS用户下运行 $ORACLE_HOME/demo/schema/sales_history/sh_main.sql来创建。缺省是在HR用户下运行例子。

SAMPLE:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水。例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200150的行没有,所以count计数值cnt32(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数

SELECT last_name, salary, COUNT(*) OVER () AS cnt1

       ,COUNT(*) OVER (ORDER BY salary) AS cnt2

       ,COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING   AND 150 FOLLOWING) AS cnt3

 FROM employees;       

LAST_NAME             SALARY       CNT1       CNT2       CNT3

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

Olson                   2100        107          1          3

Philtanker              2200        107          3          2

Markle                  2200        107          3          2

Landry                  2400        107          5          8

Gee                     2400        107          5          8

Perkins                 2500        107         11         10

Colmenares              2500        107         11         10

Patel                   2500        107         11         10

Vargas                  2500        107         11         10

……

==================================================================
利用over实现的分页功能:
--
假设code1,code2为用来分页的KEY,每页显示5行数据
select code1,code2,code3,
ceil(count(*) over(partition by code1,code2 order by rownum)/5),
count(*) over(partition by code1,code2)
from ma_kbn order by code1,code2

取出相对行的内容:

利用laglead函数,我们可以在同一行中显示前n行的数据,也可以显示后n行的数据。

LAG
功能描述:可以访问结果集中的其它行而不用进行自连接。它允许去处理游标,就好像游标是一个数组一样。在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行). LEAD则与LAG相反,LEAD可以访问组中当前行之后的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行)
SAMPLE
:下面的例子中列prev_sal返回按hire_date排序的前1行的salary, last_sal 返回下一行的salary值,"NextHired"返回按hire_date排序的下一行的hire_date

SELECT last_name, hire_date, salary,

       LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal

      ,LEAD(salary,1,0) OVER (ORDER BY hire_date) AS last_sal

      ,LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NeHired"

  FROM employees

 WHERE job_id = 'PU_CLERK';

LAST_NAME       HIRE_DATE          SALARY   PREV_SAL   LAST_SAL NeHired

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

Khoo           18-5 -95         3100          0       2800 24-7 -97

Tobias         24-7 -97         2800       3100       2800 24-12-97

Baida          24-12-97         2800       2800       2600 15-11-98

Himuro         15-11-98         2600       2800       2500 10-8 -99

Colmenares     10-8 -99         2500       2600          0

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

转载于:http://blog.itpub.net/7177735/viewspace-710101/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值