- 浏览: 146909 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
陈碧滔:
java获取工程目录路径 -
stevenjohn:
楼主能上传一下源代码吗?
ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息 -
指挥家:
讲的很好!
Foxmail6收发Web mail邮箱邮件实现原理 -
azhqiang:
谢谢你啊。呵呵
flex最全的表单验证
【2】找出每个区域订单总额排名前3的大客户:
SQL > select *
2 from ( select region_id,
3 customer_id,
4 sum (customer_sales) cust_total,
5 sum ( sum (customer_sales)) over (partition by region_id) reg_total,
6 rank() over (partition by region_id
order by sum (customer_sales) desc NULLS LAST) rank
7 from user_order
8 group by region_id, customer_id)
9 where rank <= 3 ;
REGION_ID CUSTOMER_ID CUST_TOTAL REG_TOTAL RANK
-- -------- ----------- ---------- ---------- ----------
5 4 1878275 5585641 1
5 2 1224992 5585641 2
5 5 1169926 5585641 3
6 6 1788836 6307766 1
6 9 1208959 6307766 2
6 10 1196748 6307766 3
7 14 1929774 6868495 1
7 13 1310434 6868495 2
7 15 1255591 6868495 3
8 17 1944281 6854731 1
8 20 1413722 6854731 2
8 18 1253840 6854731 3
9 25 2232703 6739374 1
9 23 1224992 6739374 2
9 24 1224992 6739374 2
10 26 1808949 6238901 1
10 27 1322747 6238901 2
10 30 1216858 6238901 3
18 rows selected.
三、First/Last排名查询:
想象一下下面的情形:找出订单总额最多、最少的客户。按照前面我们学到的知识,这个至少需要2个查询。第一个查询按照订单总额降序排列以期拿到第一名,第二个查询按照订单总额升序排列以期拿到最后一名。是不是很烦?因为Rank函数只告诉我们排名的结果,却无法自动替我们从中筛选结果。
幸好Oracle为我们在排列函数之外提供了两个额外的函数:first、last函数,专门用来解决这种问题。还是用实例说话:
SQL > select min(customer_id)
2 keep (dense_rank first order by sum (customer_sales) desc ) first,
3 min (customer_id)
4 keep (dense_rank last order by sum (customer_sales) desc ) last
5 from user_order
6 group by customer_id;
FIRST LAST
-- -------- ----------
31 1
这里有几个看起来比较疑惑的地方:
①为什么这里要用min函数
②Keep这个东西是干什么的
③fist/last是干什么的
④dense_rank和dense_rank()有什么不同,能换成rank吗?
首先解答一下第一个问题:min函数的作用是用于当存在多个First/Last情况下保证返回唯一的记录。假如我们去掉会有什么样的后果呢?
SQL > select keep (dense_rank first order by sum (customer_sales) desc ) first,
2 keep (dense_rank last order by sum (customer_sales) desc ) last
3 from user_order
4 group by customer_id;
select keep (dense_rank first order by sum (customer_sales) desc ) first,
*
ERROR at line 1 :
ORA - 00907 : missing right parenthesis
接下来看看第2个问题:keep是干什么用的?从上面的结果我们已经知道Oracle对排名的结果只“保留”2条数据,这就是keep的作用。告诉Oracle只保留符合keep条件的记录。
那么什么才是符合条件的记录呢?这就是第3个问题了。dense_rank是告诉Oracle排列的策略,first/last则告诉最终筛选的条件。
第4个问题:如果我们把dense_rank换成rank呢?
SQL > select min (region_id)
2 keep(rank first order by sum (customer_sales) desc ) first,
3 min (region_id)
4 keep(rank last order by sum (customer_sales) desc ) last
5 from user_order
6 group by region_id;
select min (region_id)
*
ERROR at line 1 :
ORA - 02000 : missing DENSE_RANK
四、按层次查询:
现在我们已经见识了如何通过Oracle的分析函数来获取Top/Bottom N,第一个,最后一个记录。有时我们会收到类似下面这样的需求:找出订单总额排名前1/5的客户。
很熟悉是不?我们马上会想到第二点中提到的方法,可是rank函数只为我们做好了排名,并不知道每个排名在总排名中的相对位置,这时候就引入了另外一个分析函数NTile,下面我们就以上面的需求为例来讲解一下:
SQL > select region_id,
2 customer_id,
3 ntile( 5 ) over ( order by sum (customer_sales) desc ) til
4 from user_order
5 group by region_id, customer_id;
REGION_ID CUSTOMER_ID TILE
-- -------- ----------- ----------
10 31 1
9 25 1
10 26 1
6 6 1
8 18 2
5 2 2
9 23 3
6 9 3
7 11 3
5 3 4
6 8 4
8 16 4
6 7 5
10 29 5
5 1 5
Ntil函数为各个记录在记录集中的排名计算比例,我们看到所有的记录被分成5个等级,那么假如我们只需要前1/5的记录则只需要截取TILE的值为1的记录就可以了。假如我们需要排名前25%的记录(也就是1/4)那么我们只需要设置ntile(4)就可以了。
参考资料:《Mastering Oracle SQL》(By Alan Beaulieu , Sanjay Mishra O'Reilly June 2004 0-596-00632-2)
博客:http://www.blogjava.net/pengpenglin/archive/2008/06/25/210536.html
SQL > select *
2 from ( select region_id,
3 customer_id,
4 sum (customer_sales) cust_total,
5 sum ( sum (customer_sales)) over (partition by region_id) reg_total,
6 rank() over (partition by region_id
order by sum (customer_sales) desc NULLS LAST) rank
7 from user_order
8 group by region_id, customer_id)
9 where rank <= 3 ;
REGION_ID CUSTOMER_ID CUST_TOTAL REG_TOTAL RANK
-- -------- ----------- ---------- ---------- ----------
5 4 1878275 5585641 1
5 2 1224992 5585641 2
5 5 1169926 5585641 3
6 6 1788836 6307766 1
6 9 1208959 6307766 2
6 10 1196748 6307766 3
7 14 1929774 6868495 1
7 13 1310434 6868495 2
7 15 1255591 6868495 3
8 17 1944281 6854731 1
8 20 1413722 6854731 2
8 18 1253840 6854731 3
9 25 2232703 6739374 1
9 23 1224992 6739374 2
9 24 1224992 6739374 2
10 26 1808949 6238901 1
10 27 1322747 6238901 2
10 30 1216858 6238901 3
18 rows selected.
三、First/Last排名查询:
想象一下下面的情形:找出订单总额最多、最少的客户。按照前面我们学到的知识,这个至少需要2个查询。第一个查询按照订单总额降序排列以期拿到第一名,第二个查询按照订单总额升序排列以期拿到最后一名。是不是很烦?因为Rank函数只告诉我们排名的结果,却无法自动替我们从中筛选结果。
幸好Oracle为我们在排列函数之外提供了两个额外的函数:first、last函数,专门用来解决这种问题。还是用实例说话:
SQL > select min(customer_id)
2 keep (dense_rank first order by sum (customer_sales) desc ) first,
3 min (customer_id)
4 keep (dense_rank last order by sum (customer_sales) desc ) last
5 from user_order
6 group by customer_id;
FIRST LAST
-- -------- ----------
31 1
这里有几个看起来比较疑惑的地方:
①为什么这里要用min函数
②Keep这个东西是干什么的
③fist/last是干什么的
④dense_rank和dense_rank()有什么不同,能换成rank吗?
首先解答一下第一个问题:min函数的作用是用于当存在多个First/Last情况下保证返回唯一的记录。假如我们去掉会有什么样的后果呢?
SQL > select keep (dense_rank first order by sum (customer_sales) desc ) first,
2 keep (dense_rank last order by sum (customer_sales) desc ) last
3 from user_order
4 group by customer_id;
select keep (dense_rank first order by sum (customer_sales) desc ) first,
*
ERROR at line 1 :
ORA - 00907 : missing right parenthesis
接下来看看第2个问题:keep是干什么用的?从上面的结果我们已经知道Oracle对排名的结果只“保留”2条数据,这就是keep的作用。告诉Oracle只保留符合keep条件的记录。
那么什么才是符合条件的记录呢?这就是第3个问题了。dense_rank是告诉Oracle排列的策略,first/last则告诉最终筛选的条件。
第4个问题:如果我们把dense_rank换成rank呢?
SQL > select min (region_id)
2 keep(rank first order by sum (customer_sales) desc ) first,
3 min (region_id)
4 keep(rank last order by sum (customer_sales) desc ) last
5 from user_order
6 group by region_id;
select min (region_id)
*
ERROR at line 1 :
ORA - 02000 : missing DENSE_RANK
四、按层次查询:
现在我们已经见识了如何通过Oracle的分析函数来获取Top/Bottom N,第一个,最后一个记录。有时我们会收到类似下面这样的需求:找出订单总额排名前1/5的客户。
很熟悉是不?我们马上会想到第二点中提到的方法,可是rank函数只为我们做好了排名,并不知道每个排名在总排名中的相对位置,这时候就引入了另外一个分析函数NTile,下面我们就以上面的需求为例来讲解一下:
SQL > select region_id,
2 customer_id,
3 ntile( 5 ) over ( order by sum (customer_sales) desc ) til
4 from user_order
5 group by region_id, customer_id;
REGION_ID CUSTOMER_ID TILE
-- -------- ----------- ----------
10 31 1
9 25 1
10 26 1
6 6 1
8 18 2
5 2 2
9 23 3
6 9 3
7 11 3
5 3 4
6 8 4
8 16 4
6 7 5
10 29 5
5 1 5
Ntil函数为各个记录在记录集中的排名计算比例,我们看到所有的记录被分成5个等级,那么假如我们只需要前1/5的记录则只需要截取TILE的值为1的记录就可以了。假如我们需要排名前25%的记录(也就是1/4)那么我们只需要设置ntile(4)就可以了。
参考资料:《Mastering Oracle SQL》(By Alan Beaulieu , Sanjay Mishra O'Reilly June 2004 0-596-00632-2)
博客:http://www.blogjava.net/pengpenglin/archive/2008/06/25/210536.html
发表评论
-
Oracle导出导入dmp文件(转)
2010-11-17 13:41 4611Oracle数据导入导出imp/exp ... -
row_number over(partition by col1 order by col2)
2010-10-28 11:16 1842row_number() OVER (PARTITION BY ... -
orcle中sys_connect_by_path的用法
2010-10-28 10:21 941sys_connect_by_path的几种 ... -
使用plsql一些常见的操作
2010-09-01 23:51 957/**创建一个访问分析表*/ create table Ac ... -
PL/SQL编程简介(转)
2010-08-12 11:24 764Oracle在数据库中引入了一种过程化编程语言,称为PL/SQ ... -
oracle函数手册(带示例)
2010-07-30 15:12 729oracle函数手册 SQL中的单记录函数 1.ASCII 返 ... -
Oracle分析函数参考手册[下][转载自JavaEye]
2010-07-30 15:08 794=============================== ... -
Oracle分析函数参考手册[上][转载自JavaEye]
2010-07-30 15:07 741=============================== ... -
Oracle 分析函数的使用(zt)
2010-07-30 15:07 6452/11/2005 09:43 FPOracle 分析函数使用 ... -
Oracle分析函数参考手册
2010-07-30 15:06 65722/06/2005 12:22 FP Oracle从8.1. ... -
Oracle函数列表速查
2010-07-30 15:03 635PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数 ... -
oracle分析函数(2)
2010-07-30 14:58 755注意这里有3条记录的订单总额是一样的。假如我们现在需要筛选排名 ... -
oracle分析函数(1)
2010-07-30 14:57 687一.分析函数(OVER) 目录: ============ ... -
用SQL语句添加删除修改字段
2010-07-27 14:19 1328增加字段alter table docdsp add dsp ... -
oracle 存储过程的基本语法
2010-07-13 18:57 6581.基本结构 CREATE OR REPLACE PROCED ... -
oracle 字符串连接
2010-06-28 15:26 840字符串连接 SQL> select 'abc' || ' ... -
系统重装后,oracle数据库中数据快速恢复
2010-06-18 15:56 14511. 准备工作把旧的ORACLE所有文件都COPY备份下来 ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2010-06-06 19:05 754Insert是T-sql中常用语句,Insert ... -
Oracle字符串处理函数
2010-06-02 19:27 1285项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料 ...
相关推荐
关于ORACLE分析函数的教程,教程描述描述清晰
ORACLE 分析函数大全,包含很多关于ORACLE的分析函数,内置函数
文档详细介绍了oracle的分析函数,包括功能说明、sql示例等。分析函数功能强大,在报表或数据迁移的时候可能会使用到。分析函数用法看上去有点复杂,最好使用的时候,参考文档
ORACLE分析函数.pdf
Oracle分析函数.doc
oracle 分析函数 开发必备 数据库开发工程师
Oracle 分析函数详解 1. 自动汇总函数rollup,cube, 2. rank 函数, rank,dense_rank,row_number 3. lag,lead函数 4. sum,avg,的移动增加,移动平均数 5. ratio_to_report报表处理函数 6. first,last取基数的分析函数
Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结
oracle分析函数(用法+实例),这属于oracle的高级应用。
分析函数是oracle中强大的功能,附件是分析函数学习笔记
Oracle分析函数,常用分析函数应有尽有
分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述 ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时...
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。
ORACLE分析函数大全 包括大部分常用的分析函数
oracle分析函数,窗口函数,报表函数 分析函数(OVER) 分析函数2(Rank, Dense_rank, row_number) 分析函数3(Top/Bottom N、First/Last、NTile)
Oracle分析函数.pdf,这份资料详细介绍了Oracle分析函数的使用,Oracle分析函数.pdf是一份不错的文档
NULL 博文链接:https://yangkai.iteye.com/blog/754447
Oracle分析函数,常见的基本统计函数里面都有,大家可以通过安装Oracle的示例数据库来一步一步跟进学习!