请教分析函数sql server first函数

博客访问: 6137677
博文数量: 544
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
Oracle SQL作为标准SQL的一种有力补充,无论是在预定义函数还是语法语义,都有了很多强大的功能。我们日常工作中,经常遇到各种各样的SQL报表和查询需求,用好Oracle SQL语句和特性,可以帮助我们更好、更快的实现需求。
本篇介绍两个在研究过程中使用的两个特性,记录下来,供有需要的朋友查询。
1、空值排序位置控制——NULLS FIRST/LAST
在Oracle中,NULL值是一种非常特殊的类型。大多数的操作中如果涉及到NULL值,意味着操作结果是NULL。排序Order过程中,如果NULL值存在在数据列中,那么NULL值是算最小还是最大值呢?
我们通过实验来验证,首先,选择11gR2的环境。
SQL> select * from v$
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE&&&&&&& 11.2.0.1.0&&&&&&&& Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
构建一个小数据表T。
SQL> create table t as select object_id, owner from dba_objects where rownum<10;
Table created
Name&&&&& Type&&&&&&&& Nullable Default Comments
--------- ------------ -------- ------- --------
OBJECT_ID NUMBER&&&&&& Y&&&&&&&&&&&&&&&&&&&&&&&&
OWNER&&&& VARCHAR2(30) Y&&&&&&&&&
SQL> update t set object_id=null where rownum<3;
2 rows updated
Commit complete
SQL> select *
&OBJECT_ID OWNER
---------- ------------------------------
&&&&&&&&&& SYS
&&&&&&&&&& SYS
&&&&&&& 28 SYS
&&&&&&& 15 SYS
&&&&&&& 29 SYS
&&& &&&&&3 SYS
&&&&&&& 25 SYS
&&&&&&& 41 SYS
&&&&&&& 54 SYS
9 rows selected
查看默认的排序行为。
--数字类型排列
SQL> select * from t order by object_
&OBJECT_ID OWNER
---------- ------------------------------
&&&&&&&& 3 SYS
&&&&&&& 15 SYS
&&&&&&& 25 SYS
&&&&&&& 28 SYS
&&&&&&& 29 SYS
&&&&&&& 41 SYS
&&&&&&& 54 SYS
&&&&&&&&&& SYS
&&&&&&&&&& SYS
9 rows selected
--字符串排列
SQL> update t set wner=null where rownum<3 and object_
2 rows updated
Commit complete
SQL> select * f
&OBJECT_ID OWNER
---------- ------------------------------
&&&&&&&&&& SYS
&&&&&&&&&& SYS
&&&&&&& 29 SYS
&&&&&&& 41 SYS
&&&&&&& 54 SYS
&&&&&&&& 3 SYS
&&&&&&& 25 SYS
&&&&&&& 15
&&&&&&& 28
9 rows selected
默认情况下,数字和字符串类型的排列过程中,null值是排列在后面,位于末尾。
在Oracle中,我们是可以控制空值的排列顺序的。具体的方法就是使用NULLS FIRST和NULLS LAST。
NULLS FIRST顾名思义,就是将空值排列在结果集合前面。
SQL> select * from t order by object_
&OBJECT_ID OWNER
---------- ------------------------------
&&&&&&&&&& SYS
&&&&&&&&&& SYS
&&&&&&&& 3 SYS
&&&&&&& 15
&&&&&&& 25 SYS
&&&&&&& 28
&&&&&&& 29 SYS
&&&&&&& 41 SYS
&&&&&&& 54 SYS
9 rows selected
同样道理,使用NULLS LAST就是将空值排列在后面。
SQL> select * from t order by object_
&OBJECT_ID OWNER
---------- ------------------------------
&&&&&&&& 3 SYS
&&&&&&& 15
&&&&&&& 25 SYS
&&&&&&& 28
&&&&&&& 29 SYS
&&&&&&& 41 SYS
&&&&&&& 54 SYS
&&&&&&&&&& SYS
&&&&&&&&&& SYS
9 rows selected
NULLS LAST是order by的默认选项。使用nulls first/last,就可以方便的控制空值出现的位置,应对不同的情景要求。
2、获取前n月的平均值——AVG巧用
各种汇总报表中,有一种依托时间进行时间序列分析的报表。这种报表中经常包括“前n个月数据平均值”。我们首先构建出实验数据表。
SQL> create table t_sample (bsp_code varchar2(10), bill_period varchar2(6), curr_value number, avg_value number);
Table created
Executed in 0.078 seconds
(输入数据过程略……)
SQL> select * from t_
BSP_CODE&& BILL_PERIOD CURR_VALUE& AVG_VALUE
---------- ----------- ---------- ----------
CN&&&&&&&& 130301&&&&&&&&&&&& 103
CN&&&&&&&& 130302&&&&&&&&&&&& 144
CN&&&&&&&& 130303&&&&&&&&&&&&& 43
CN&&&&&&&& 130304&&&&&&&&&&&& 344
CN&&&&&&&& 130401&&&&&&&&&&&& 444
AU&&&&&&&& 130102&&&&&&&&&&&& 444
AU&&&&&&&& 130103&&&&&&&&&&&& 344
AU&&&&&&&& 130104&&&&&&&&&&&&& 34
8 rows selected
Executed in 0.047 seconds
不同BSP_CODE表示不同的组织地区,bill period表示时间的序号,从小到大排列。Curr_value表示当前地区在当前时间期间的销售额度。
现在要求在显示本期销售数据的时候,还要显示包括当前期在内的2期(一个BSP_CODE内)的销售平均值。
这个需求的难点在于两点:组内分析和有限数目求平均值操作。组内分组是指必须在相同的BSP_CODE内进行处理。有限数目求平均表示如何进行控制2期的平均值计算过程。
此时,我们需要使用avg平均值函数的拓展功能。Oracle对avg函数进行了拓展,使用over中的partition可以控制统计汇总的窗口范围。此外rows between可以控制聚合函数的前后操作范围。
SQL> select bsp_code, bill_period, curr_value,
& 2&&&&&&&& avg(curr_value) over (partition by bsp_code order by bill_period
& 3&&&&&&&& rows between 2 preceding and 0 following) as avg_value
& 4& from t_
BSP_CODE&& BILL_PERIOD CURR_VALUE& AVG_VALUE
---------- ----------- ---------- ----------
AU&&&&&&&& 130102&&&&&&&&&&&& 444&&&&&&& 444
AU&&&&&&&& 130103&&&&&&&&&&&& 344&&&&&&& 394
AU&&&&&&&& 130104&&&&&&&&&&&&& 34&&&&&&& 274
CN&&&&&&&& 130301&&&&&&&&&&&& 103&&&&&&& 103
CN&&&&&&&& 130302&&&&&&&&&&&& 144&&&&& 123.5
CN&&&&&&&& 130303&&&&&&&&&&&& &43 96.6666666
CN&&&&&&&& 130304&&&&&&&&&&&& 344&&&&&&& 177
CN&&&&&&&& 130401&&&&&&&&&&&& 444&&&&&&& 277
8 rows selected
Executed in 0.031 seconds
Rows between 2 preceding and 0 following,表示聚合函数处理范围是向前2个处理期,向后0个处理期。
Oracle SQL语句功能很强大。学习点滴,留待友人待查。
阅读(5346) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。常用的几个分析函数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
常用的几个分析函数
上传于||文档简介
&&O&#8203;r&#8203;a&#8203;c&#8203;l&#8203;e&#8203;数&#8203;据&#8203;库&#8203;中&#8203;常&#8203;用&#8203;的&#8203;几&#8203;个&#8203;分&#8203;析&#8203;函&#8203;数
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢2972人阅读
oracle(39)
注意:与max,min的区别,虽然也可以实现,但只是针对数字字段.
1、初始化原始数据:
create table test (id number(2), name varchar2(10), salary number(6,2));
insert into test values (1,'Tom',120);
insert into test values (2,'Ellen',240);
insert into test values (2,'Joe',80);
insert into test values (3,'Andy',300);
insert into test values (3,'Kary',500);
insert into test values (3,'Erick',1300);
insert into test values (3,'Hou',40);
insert into test values (3,'Mary',200);
insert into test values (3,'Secooler',800);
select * from test order by ID,
&ID NAME&&&&&&&& SALARY
--- ---------- --------
& 1 Tom&&&&&&&&& 120.00
& 2 Ellen&&&&&&& 240.00
& 2 Joe&&&&&&&&&& 80.00
& 3 Andy&&&&&&&& 300.00
& 3 Erick&&&&&& 1300.00
& 3 Hou&&&&&&&&&& 40.00
& 3 Kary&&&&&&&& 500.00
& 3 Mary&&&&&&&& 200.00
& 3 Secooler&&&& 800.00
2、LAST_VALUE分析函数的简单用法
(1)在TEST表中添加一列,标识每一个数据分区中薪水最高的人名。
select ID, name, salary, LAST_VALUE(name) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID,
&ID NAME&&&&&&&& SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
& 1 Tom&&&&&&&&& 120.00 Tom
& 2 Ellen&&&&&&& 240.00 Ellen
& 2 Joe&&&&&&&&&& 80.00 Ellen
& 3 Andy&&&&&&&& 300.00 Erick
& 3 Erick&&&&&& 1300.00 Erick
& 3 Hou&&&&&&&&&& 40.00 Erick
& 3 Kary&&&&&&&& 500.00 Erick
& 3 Mary&&&&&&&& 200.00 Erick
& 3 Secooler&&&& 800.00 Erick
注意其中“ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING”的使用,若省略效果如下。
select ID, name, salary, LAST_VALUE(name) OVER (partition by ID order by salary) as highest_sal_name from test order by ID,
&ID NAME&&&&&&&& SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
& 1 Tom&&&&&&&&& 120.00 Tom
& 2 Ellen&&&&&&& 240.00 Ellen
& 2 Joe&&&&&&&&&& 80.00 Joe
& 3 Andy&&&&&&&& 300.00 Andy
& 3 Erick&&&&&& 1300.00 Erick
& 3 Hou&&&&&&&&&& 40.00 Hou
& 3 Kary&&&&&&&& 500.00 Kary
& 3 Mary&&&&&&&& 200.00 Mary
& 3 Secooler&&&& 800.00 Secooler
显然这不是我们想要的效果:(,这是为什么呢~~~?给您一次思考和回答的机会。
如果对UNBOUNDED PRECEDING和UNBOUNDED FOLLOWING不熟悉,请参考Oracle官方文档“windowing_clause”/docs/cd/B19306_01/server.102/b14200/functions001.htm#i97640。
在TEST表中添加一列,标识每一个数据分区中薪水最高的薪水&#20540;。
col highest_sal_name for 9999
select ID, name, salary, LAST_VALUE(SALARY) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID,
&ID NAME&&&&&&&& SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
& 1 Tom&&&&&&&&& 120.00&&&&&&&&&&&&& 120
& 2 Ellen&&&&&&& 240.00&&&&&&&&&&&&& 240
& 2 Joe&&&&&&&&&& 80.00&&&&&&&&&&&&& 240
& 3 Andy&&&&&&&& 300.00&&&&&&&&&&&& 1300
& 3 Erick&&&&&& 1300.00&&&&&&&&&&&& 1300
& 3 Hou&&&&&&&&&& 40.00&&&&&&&&&&&& 1300
& 3 Kary&&&&&&&& 500.00&&&&&&&&&&&& 1300
& 3 Mary&&&&&&&& 200.00&&&&&&&&&&&& 1300
& 3 Secooler&&&& 800.00&&&&&&&&&&&& 1300
3、与之相对应的是FIRST_VALUE函数
select ID, name, salary, FIRST_VALUE(name) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID,
&ID NAME&&&&&&&& SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
& 1 Tom&&&&&&&&& 120.00 Tom
& 2 Ellen&&&&&&& 240.00 Joe
& 2 Joe&&&&&&&&&& 80.00 Joe
& 3 Andy&&&&&&&& 300.00 Hou
& 3 Erick&&&&&& 1300.00 Hou
& 3 Hou&&&&&&&&&& 40.00 Hou
& 3 Kary&&&&&&&& 500.00 Hou
& 3 Mary&&&&&&&& 200.00 Hou
& 3 Secooler&&&& 800.00 Hou
select ID, name, salary, FIRST_VALUE(SALARY) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID,
&ID NAME&&&&&&&& SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
& 1 Tom&&&&&&&&& 120.00&&&&&&&&&&&&& 120
& 2 Ellen&&&&&&& 240.00&&&&&&&&&&&&&& 80
& 2 Joe&&&&&&&&&& 80.00&&&&&&&&&&&&&& 80
& 3 Andy&&&&&&&& 300.00&&&&&&&&&&&&&& 40
& 3 Erick&&&&&& 1300.00&&&&&&&&&&&&&& 40
& 3 Hou&&&&&&&&&& 40.00&&&&&&&&&&&&&& 40
& 3 Kary&&&&&&&& 500.00&&&&&&&&&&&&&& 40
& 3 Mary&&&&&&&& 200.00&&&&&&&&&&&&&& 40
& 3 Secooler&&&& 800.00&&&&&&&&&&&&&& 40
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:530038次
积分:6440
积分:6440
排名:第2453名
原创:79篇
转载:209篇
评论:32条
(4)(1)(1)(3)(3)(1)(8)(8)(2)(3)(1)(1)(1)(1)(8)(8)(11)(24)(16)(21)(68)(7)(2)(1)(7)(15)(23)(1)(5)(9)(4)(15)(6)分析函数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
你可能喜欢博客访问: 6137681
博文数量: 544
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
给主人留下些什么吧!~~
写的确实好,写的不隐晦和深奥,有点基础一看就懂。不错不错。
kingsql:哥哥,你怎么申请的专家徽章,能不能教教我
您好:您可以联系论坛管理员或者根据首页上的链接联系网站方面,提供相应资料。如果需要其他帮助,请联系我即可。。。
哥哥,你怎么申请的专家徽章,能不能教教我
博客太好了,赞~~!
jackson198574:好文章太多了,支持原创!~~~
多谢鼓励,共同提高~
请登录后留言。}

我要回帖

更多关于 sql first 函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信