rank() over(partition)的使用
2016-02-03 15:37
260 查看
有的时候会遇到这样的问题,我们需要查询一张表,而且要按照业务排序,比如我需要如下的结果:
地区 日期 费用 产品编号 用户编号
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如下:
该语句执行的结果就是上述的情况了。
一不做二不休,我顺便查看一下该语句的执行计划好了。
首先写一下我的建表语句:
我按照地域进行了分区,其实也可以按照时间进行分区。explain一下plan:
可以看到,只有10条记录的表,COST却高达4,不得不说采取这个办法会极大地降低查询的效率。但是业务上需要的话,rank() over确实是一个很好使的玩意儿。
加两条数据进去,顺便测测分区表是否真的可以在没有索引的情况下提高一点点效率。加了两条数据,area_id是911,陕西省宝鸡市的区号:0911。语句也稍微变动一下:
explain一下plan:
发现虽然现在是12行数据,但是因为我只查询西安市(290),所以在rows里仍旧只是10行,没有新添加的宝鸡市的2行。由此可见,在面对非常海量的数据存储时,按照一定的条件建立分区,是十分有必要的。不过按照时间建立分区可能会稍微麻烦点,因为时间在不停的推进,多少年之后,你现在建立的分区就已经不可能再用了,就要添加新的分区进去,这也是一个挺讨厌的事情。
转自:http://www.cnblogs.com/wingsless/archive/2012/02/04/2338292.html
地区 日期 费用 产品编号 用户编号
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
相关文章推荐
- windbg的lastevent命令
- ViewPager 图片切换
- Using TurboVNC 0.6 and VirtualGL 2.1.4 to run OpenGL Application Remotely on CentOS
- Linux流量监控工具 - iftop (最全面的iftop教程)
- 206. Reverse Linked List
- bzero, bcopy等函数源代码实现
- 倒计时效果的递归实现
- 新编辑器Cocos Creator发布:对不起我来晚了!
- 运用python 画圆
- Tip_卡(qiǎ)时
- 微信企业号开发(七)---图片上传与下载
- 转:Eclipse插件开发之TreeViewer
- 星星鼠标特效,看起来真棒
- spring源码学习之四 BeanDefinitionParserDelegate分析
- maven常见问题记录
- 【独家】2015年App Store审核被拒的23个理由(附官方邮件原文)
- 多个viewpager导致的不显示问题
- Swift最酷炫的七大功能
- Android实战技巧之四十八:Android上的Java8和kotlin
- python-------打印与字符串格式化