rank() over(partition)的使用
有的时候会遇到这样的问题,我们需要查询一张表,而且要按照业务排序,比如我需要如下的结果:
地区 日期 费用 产品编号 用户编号
290 201202 258 1 s1
290 201202 200 1 s5
290 201202 100 1 s100
290 201202 90 2 s7
290 201202 88 2 s9
290 201202 10 2 s12。
领导让我出一张报表,需要看到每一个业务的收费前三名是那些客户。这个时候用rank() over(partition)是一个很不错的选择。
我的测试表就像上面例子中的表一样,不过数据稍微多一点点。给大家一个截图:

可以看到我每一个项目都有5条记录,我只取前三,那么SQL如下:

SELECT A.AREA_ID, A.ACCT_MONTH, A.FEE, A.ITEM_ID, A.USER_ID
FROM (SELECT T.AREA_ID,
T.ACCT_MONTH,
T.FEE,
T.ITEM_ID,
T.USER_ID,
RANK() OVER(PARTITION BY T.ITEM_ID ORDER BY T.FEE DESC) RK
FROM TEST T) A
WHERE RK < 4;

该语句执行的结果就是上述的情况了。
一不做二不休,我顺便查看一下该语句的执行计划好了。
首先写一下我的建表语句:

CREATE TABLE TEST
(
area_id NUMBER,
acct_month NUMBER,
fee NUMBER,
item_id NUMBER
)
PARTITION BY LIST(area_id)
(
PARTITION part_290 VALUES('290'),
PARTITION part_910 VALUES('910'),
PARTITION part_911 VALUES('911'),
partition part_912 values('912'),
partition part_913 values('913'),
partition part_914 values('914'),
partition part_915 values('915'),
partition part_916 values('916'),
partition part_917 values('917'),
partition part_919 values('919'),
partition part_default values(default)
)

我按照地域进行了分区,其实也可以按照时间进行分区。explain一下plan:

可以看到,只有10条记录的表,COST却高达4,不得不说采取这个办法会极大地降低查询的效率。但是业务上需要的话,rank() over确实是一个很好使的玩意儿。
加两条数据进去,顺便测测分区表是否真的可以在没有索引的情况下提高一点点效率。加了两条数据,area_id是911,陕西省宝鸡市的区号:0911。语句也稍微变动一下:

SELECT A.AREA_ID, A.ACCT_MONTH, A.FEE, A.ITEM_ID, A.USER_ID
FROM (SELECT T.AREA_ID,
T.ACCT_MONTH,
T.FEE,
T.ITEM_ID,
T.USER_ID,
RANK() OVER(PARTITION BY T.ITEM_ID ORDER BY T.FEE DESC) RK
FROM TEST T
WHERE t.area_id = 290) A
WHERE RK < 4;

explain一下plan:

发现虽然现在是12行数据,但是因为我只查询西安市(290),所以在rows里仍旧只是10行,没有新添加的宝鸡市的2行。由此可见,在面对非常海量的数据存储时,按照一定的条件建立分区,是十分有必要的。不过按照时间建立分区可能会稍微麻烦点,因为时间在不停的推进,多少年之后,你现在建立的分区就已经不可能再用了,就要添加新的分区进去,这也是一个挺讨厌的事情。
转自:http://www.cnblogs.com/wingsless/archive/2012/02/04/2338292.html
rank() over(partition)的使用的更多相关文章
- Rank() over(partition ... 分组统计的实例
USE [NanFeng]GO/****** Object: StoredProcedure [dbo].[st_MES_RptMaterilSum] Script Date: 04/18/2016 ...
- Oracle分析函数-rank() over(partition by...order by...)
select *from ( SELECT t.s#,---学号 t.c#,---课程号 T.SCCORE, ---成绩 RANK() OVER(PARTITION BY t.c# ORDER BY ...
- 分分钟搞懂rank() over(partition by)的使用
一.rank() over(partition by ...order by) 解释:partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组. 二.语法:ROW_NUM ...
- rank over partition by
高级函数,分组排序 over: 在什么条件之上. partition by e.deptno: 按部门编号划分(分区). order by e.sal desc: 按工资从高到低排序(使用rank() ...
- oracle rank over partition by
转自:https://www.cnblogs.com/wingsless/archive/2012/02/04/2338292.html rank() over(partition)的使用 有的时 ...
- oracle row_number() over(partition by .. order by ..)和rank() over(partition by .. order by ..) 和dense_rank() over(partition by .. order by ..)的相似点与区别
新建一个测试表 create table dim_ia_test2(device_number varchar2(20),desc2 varchar2(20)) 插入数据后得到: 一.oracle r ...
- rownum, row_number(), rank() , dense_rank(), partition by ,max() keep 语句的区别与用法
rownum,rownumber(), rank(),dense_rank()都是用来为记录分配序号的, rownum只能在orderby语句排完序后,在外层嵌套查询才能获得正确的行号,用起来相当复杂 ...
- MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
各班级学生成绩测试表 select * from TMP_A; 实现目的: 按照班级分类后按照分数倒序排序 采用MySQL变量简单实现,SQL如下: SELECT a.stu_id,a.point, ...
- 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...
随机推荐
- 12232 - Exclusive-OR
12232 - Exclusive-OR 题目大意是可以设定一个点Xp=v,或者Xp^Xq=v,然后查询Xa^Xb^Xc...等于多少. 由于异或操作跟判连通性很类似,这里可以使用并查集来解决,对于X ...
- POJ3260——The Fewest Coins(多重背包+完全背包)
The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...
- python函数--传参
一.位置参数 二.关键字参数 三.默认参数 四.任意数量的位置参数: 1. *x 2. 传入的多个参数,最终合并成一个元组 3. 之后的参数必须用关键字参数 五.任意数量的关键字参数 1. **x 2 ...
- 抱怨IT公司人才缺乏?留住现有人才方是正途
摘要:员工的好坏决定着IT公司的未来,可很多IT公司在抱怨之时自己的人才却正在流失,如何留住现有的优秀员工?国外知名经理人Sharon Florentine建议:改善自己的管理.让员工不断地学习.创建 ...
- HTML5学习(十一)---服务器发送事件
参考教程:http://www.w3school.com.cn/html5/html_5_serversentevents.asp HTML5 服务器发送事件(server-sent event)允许 ...
- 不能设置sublime text 2 为默认编辑器
今天遇到一个有趣的事情,当我设置 css 样式表的默认打开方式的时候,却始终无法设置成功,系统总是随机选取一种打开方式来打开文件.比如:pdf.DW.txt等方式. 我设置默认打开方式的步骤如下: 1 ...
- [C#] 我的log4net使用手册
1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...
- BZOJ_1020_[SHOI2008]_安全的航线flight_(计算几何+二分)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1020 给出一条航线(折线),给出\(c\)个陆地(多边形).求航线上距离陆地的最近距离最远的距 ...
- 【转】Linux(Ubuntu)下面SecureCRT 完全破解
仅供测试, 勿用作商业用途.首先要到vandyke网站下载一个securecrt, 需要注册.http://www.vandyke.com/download/securecrt/download.ht ...
- 018如何建立自动化框架 how to bulid the framwork
本讲包括: 一. objective 二. How to bulid 三. Keyview of frawork (关键视图) 四. conclusion automation framwork:自动 ...