同事问了一个非常简单的问题,怎么取出每个partition里面另外一个列的最小值?

create table t1 (int c1, int c2);

 

假如按照c2分区,0-10,10-20,20-30,30-40,40-50

 

insert into t1 values(101, 1);
insert into t1 values(102, 2);
insert into t1 values(111, 11);
insert into t1 values(112, 12);
insert into t1 values(121, 21);
insert into t1 values(122, 22);
insert into t1 values(131, 31);
insert into t1 values(132, 32);
insert into t1 values(133, 32);
insert into t1 values(132, 33);
insert into t1 values(141, 41);
insert into t1 values(142, 42);
insert into t1 values(142, 43);

 

本来这个问题非常简单,但今天死活想不出来了,居然绕着去看RANK系列的OLAP函数,学习了好长时间也发现没办法搞定。

其实只需要按照分区表的范围取整数就可以了

 

select cast(c2/10 as integer), min(c1),max(c1) from t1
group by cast(c2/10 as integer);
 
输出如下:
 1 	2   	3
- --- ---
0 101 102
1 111 112
2 121 122
3 131 133
4 141 142

不过倒是又温习了一下RANK系列函数,简单总结一下:

RANK() 排名函数 ,返回值是不连续的,如果有两个相同的第一名,则第三个值为3

DENSE_RANK() 奥运冠军排名函数,返回值是连续的,可以并列第一,然后第二名,第三名

ROW_NUMBER() 连续值,基本可以看作ORACLE里的ROWNUM

OVER()可以加分区列或者列表达式,这样在输出max(c1)的时候如果分在一个区,所有的值都是一样的

 

SELECT c1,c2,CAST(C2/10 AS INTEGER),MAX(C1) OVER( PARTITION BY CAST(C2/10 AS INTEGER)) FROM T1;

 

得到如下输出:

 C1  	C2 	3 	4
--- -- - ---
101 1 0 102
102 2 0 102
111 11 1 112
112 12 1 112
121 21 2 122
122 22 2 122
131 31 3 133
132 33 3 133
133 32 3 133
132 32 3 133
141 41 4 142
142 43 4 142
142 42 4 142

OVER 内还可以加ORDER BY 用来指定排序的时候用那个column

另外一个非常有用的功能是窗口函数可以在OVER()内指定rows或者range来指定以当前行为范围的一个窗口,在这个窗口内来进行聚集函数的计算。

比如, 我想看看某商品当前日期的价格和此前30天的平均价格:

 
SELECT c1 as price,c2 as days,avg(C1)  OVER(
order by c2 range 30 PRECEDING
) as avg_price
FROM T1;
 

结果如下:

 PRICE 	DAYS 	AVG_PRICE
----- ---- ---------
101 1 101
102 2 101
111 11 104
112 12 106
121 21 109
122 22 111
131 31 114
132 32 120
133 32 120
132 33 124
141 41 126
142 42 129
142 43 132

在我想来,窗口函数最有用的功能是看当前股票价格和此前一段时间的平均价格。

这就是OLAP之RANK系列函数的简单介绍,有了这些知识之后应该可以很快的写出更多更加有用的SQL。我的感觉是RANK系列函数相当于在处理每一行的数据的同时都可以为某其它列带着group by,非常强大。但千万注意,这里面的任何函数都会导致扫面非常多的数据,所以这类SQL的性能不会太好,千万在online的程序中慎用。

从简单需求到OLAP的RANK系列函数的更多相关文章

  1. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...

  2. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  3. PHP进程通信基础——shmop 、sem系列函数使用

    PHP进程通信基础--shmop .sem系列函数使用 进程通信的原理就是在系统中开辟出一个共享区域,不管是管道也好,还是共享内存,都是这个原理.如果心中有了这个概念,就会很方便去理解代码.由于官网上 ...

  4. 第8章 用户模式下的线程同步(1)_Interlocked系列函数

    8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...

  5. PHP ob系列函数详解

    一. 相关函数简介:    1.Flush:刷新缓冲区的内容,输出.    函数格式:flush()    说明:这个函数经常使用,效率很高.    2.ob_start :打开输出缓冲区    函数 ...

  6. php Output Control 函数 ob_系列函数详解

    <?php /* * 输出缓冲控制 * * flush — 刷新输出缓冲 ob_clean — 清空(擦掉)输出缓冲区 ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 ob_en ...

  7. linux tricks 之VA系列函数.

    VA函数(variable argument function),参数个数可变函数,又称可变参数函数.C/C++编程中,系统提供给编程人员的va函数很少.*printf()/*scanf()系列函数, ...

  8. 原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  9. (转)原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

随机推荐

  1. nginx“虚拟目录”不支持php的解决办法

    这几天在配置Nginx,PHP用FastCGI,想装一个phpMyAdmin管理数据库,phpMyAdmin不想放在网站根目录 下,这样不容易和网站应用混在一起,这样phpMyAdmin的目录就放在别 ...

  2. 一个资深iOS开发者对于React Native的看法

    一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道.   我认为一个js开发者可以使用javasc ...

  3. windows信息

    echo system('systeminfo'); echo "系统类型".php_uname("s")."<br>"; ec ...

  4. Maven3下的java web项目

    咱们使用Maven3构建一个j2ee项目,项目的成果是一个war包,只需把它部署在服务器上,就可以使用浏览器访问. 具体详细信息 参考  http://www.mossle.com/docs/mave ...

  5. LINUX数据库的备份,以及远程授权登陆

    mysql dump -u root -p juhui > /data/juhui.sql   //备份数据库 grant all privileges on *.* to xf111@loca ...

  6. 文件代码对比软件 Beyond Compare

    Beyond Compare https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=Beyond%20Co ...

  7. Java程序设计 实验五

    实     验    报     告 课程:Java 班级: 1353    姓名:李海空   学号:20135329 成绩:              指导教师:娄嘉鹏   实验日期:2015.6. ...

  8. 示例-创建表格&使用表格对象

    @charset "utf-8";/* CSS Document */table{ border:#249bdb 1px solid; width:500px; border-co ...

  9. Vim配置文件备忘

    "我的配置 """""""""其他"""""&qu ...

  10. Codeforces Round #375 (Div. 2) A B C D F

    A 数轴上有三个人要到一个点去过年 使三个人走路距离的和最小  让两边的人都走到中间那个点即可 B 给出一个字符串 其中有_ ( ) 三种字符和英文字母 连续的英文字母是一个单词 括号对中不会套括号对 ...