- 浏览: 576850 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
【1】找出所有订单总额排名前3的大客户:
SQL> select *
SQL> from (select region_id,
SQL> customer_id,
SQL> sum(customer_sales) cust_total,
SQL> rank() over(order by sum(customer_sales) desc NULLS LAST) rank
SQL> from user_order
SQL> group by region_id, customer_id)
SQL> where rank <= 3;
REGION_ID CUSTOMER_ID CUST_TOTAL RANK
---------- ----------- ---------- ----------
9 25 2232703 1
8 17 1944281 2
7 14 1929774 3
SQL>
【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)就可以了。
本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/database/oracle/20081216/14775_4.html
发表评论
-
Oracle数据库的锁类型(转)
2014-05-08 14:05 1135Oracle数据库的锁类型 o ... -
AWR报告手动生成
2014-04-12 12:23 1000sqlplus / as sysdba SQL> ... -
PowerDesigner脚本生成
2013-11-23 17:04 8631 PowerDesigner中批量根据对象的name生 ... -
EXP-00011:oracle11g 空表不能exp导出的问题
2013-05-23 10:51 1403环境:Oracle11gR2+linux RH 5.5 最 ... -
新建Oracle数据库2种方法
2013-03-14 15:53 1156新建Oracle数据库2种方法:1.通过运行Oracle ... -
(转)查看执行计划
2012-09-29 11:00 1473Oracle10g获取sql语句的执 ... -
(转)ORACLE 数据库(查询--主键外键约束)
2012-05-15 15:50 2150-- 查询外键约束(查某表的所有父表) sel ... -
(转)Redhat Linux安装Oracle 11g R2数据库
2012-04-04 22:17 1746Oracle目前最新的版本是11g R2版本,网上不少安装介绍 ... -
ORA-28001: the password has expired
2012-02-23 13:47 9496大早上正式库提示: Oracle提示错误消息ORA-28 ... -
linux自动备份数据库
2012-02-13 18:08 1035#!/bin/sh export PATH=$PATH:$H ... -
Oracle中使用sys_connect_by_path函数实现行转列
2012-01-09 20:16 1379select category ,MAX(s ... -
Oracle强杀进程,解决表锁死等问题
2011-10-17 17:49 11971、找到sid,serial#; SELECT /*+ ... -
Oracle常用技巧(转)
2011-10-11 14:39 10141.删除表空间 DROP TABLESPACE ... -
查询oracle表的信息(表,字段,约束,索引)
2011-08-09 12:22 11281、查询出所有的用户表 select * fro ... -
Oracle index
2011-08-09 12:19 1126索引: 1、一般索引: create inde ... -
(转)oracle执行计划
2011-07-20 19:23 1081一.相关的概念 ... -
ORA-01658 表空間大小不足
2011-02-22 12:24 1326解決方法: 1.查詢各個表空間的利用率 sele ... -
(转)ORACLE数据导入导出
2011-02-19 15:45 904Oracle数据导入导出imp/exp就相当于oracle数据 ... -
Oracle 10g 安装之网络适配器要求 Microsoft Loopback Adapter (环回适配器)
2011-02-19 15:36 4690安装10g的时候,遇到了 ... -
【ORA-12560: TNS: 协议适配器错误】解决方案
2011-02-19 14:42 1351ORA-12560: TNS: 协议适配器错误的问题的原因有三 ...
相关推荐
分析函数在`oracle函数介绍(6) 著名函数之分析函数.doc`、`oracle函数介绍(7) 非著名函数之分析函数.doc`和`oracle函数介绍(5) 分析函数简述.doc`中详述,它们可以对整个结果集执行计算,而不仅仅是单行或分组。...
分析函数在Oracle中用于基于分组计算聚合值,每个组可能返回多行,但此处不再详述。 在实际开发中,理解和熟练掌握这些函数对于处理和分析数据至关重要。例如,字符串函数在处理文本数据时非常有用,而数字函数在...
本文将详述“Oracle函数大全”中涵盖的关键知识点,帮助读者深入理解和掌握Oracle数据库中的函数应用。 1. **字符串处理函数** - `SUBSTR()`:从字符串中提取子串。 - `LENGTH()`:返回字符串的长度。 - `UPPER...
2. **安装与配置**:详述如何在不同的操作系统上安装Oracle数据库,包括服务器配置、网络设置、实例创建等步骤。 3. **SQL语言**:深入讲解Oracle SQL语法,包括数据查询、插入、更新、删除操作,以及更复杂的联接...
【Oracle函数大全】这篇文档详述了Oracle数据库中两种主要的函数类型:单行函数和组函数。在Oracle SQL和PL/SQL中,函数扮演着重要角色,它们接受零个或多个参数,并返回一个值。单行函数主要用于处理单行数据,而组...