OVER(PARTITION BY)函数介绍

  • Post author:
  • Post category:其他



  • 问题场景

最近在项目中遇到了对每一个类型进行求和并且求该类型所占的比例,当时考虑求出每种类型的和,并在java中分别对每一种类型的和与总和相除求出所占比例。后来,想到这样有点麻烦,并且项目中持久层使用的是iBatis框架,所有考虑从SQL方面进行入手来简化这个问题。

后来SQL的解决方法就为:

1 SELECT T.CHANNEL AS PATTERN,
2        COUNT(T.TRANSACTIONKEY) AS T_COUNT,
3        SUM(T.AMT) AS T_AMT,
4        ROUND(100 * SUM(T.AMT) / SUM(SUM(T.AMT)) OVER(PARTITION BY 1), 2) AS AMT_PERCENT,
5        ROUND(100 * COUNT(T.TRANSACTIONKEY) / SUM(COUNT(T.TRANSACTIONKEY)) OVER(PARTITION BY 1),2) AS COUNT_PERCENT
6   FROM XX(表名) T
7  WHERE T.PARTY_ID = '100579050'
8  GROUP BY T.CHANNEL

看到这里自己很佩服SQL的强大,于是刨根问底,深入研究了一番Oracel的OVER(PARTITION BY)函数。


  • 简介

开窗函数,Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。

下面的测试用例数据语句如下:


 1 create table T2_TEMP(
 2     NAME varchar2(10) primary key,
 3     CLASS varchar2(10),
 4     SROCE NUMBER 
 5 )
 6 
 7 insert into T2_TEMP (NAME, CLASS, SROCE)
 8 values ('cfe', '2', 74);
 9 
10 insert