同事问了一个非常简单的问题,怎么取出每个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. OSG-OSGEarth

    OSG-OSGEarth 初次使用Cmake——以OsgEarth工程创建为例 转:http://www.cnblogs.com/Realh/archive/2012/02/08/2342507.ht ...

  2. MongoDB数据库的简介及安装

    一.MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自“humongous”,是一种开源的文档数据库──No ...

  3. POI操作Excel常用方法总结 (转)

    以下的链接为原创地址: http://blog.csdn.net/huazhangena/article/details/7587731 http://blog.csdn.net/huazhangen ...

  4. iosiPhone屏幕尺寸、分辨率及适配

    iosiPhone屏幕尺寸.分辨率及适配     1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Fac ...

  5. vector容器的用法

    转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.p ...

  6. Bootstrap css背景图片的设置

    一. 网页中添加图片的方式有两种 一种是:通过<img>标签直接插入到html中 另一种是:通过css背景属性添加 居中方法:水平居中的text-align:center 和 margin ...

  7. vi/vim初步接触

    vi和vim一直被人津津乐道,到底是什么使得它们如此受欢迎? vi分为3种模式:一般模式,编辑模式,命令行模式. (1)一般模式: 进入vi后,默认就是一般模式. 用处:方便地移动光标,删除字符/整行 ...

  8. Windows内核 WDM驱动程序的基本结构和实例

    WDM驱动的基本结构: WDM驱动模型是建立在NT式驱动程序模型基础之上的.对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成. 1)物理设备对象和功能设备 ...

  9. 增强for循环

    import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...

  10. String-自定义功能

    <script> /* *发现js中的String对象有限,想要对字符串操作的其他功能. *比如:去除字符串两端的空格.这时只能自.定义 */ //去除字符串两端的空格 function ...