1. 程式人生 > >分析函數之開窗函數over

分析函數之開窗函數over

滑動 over rank ast 範圍 功能 clas 窗函數 窗口大小

一、分析函數
-- Oracle從8.1.6開始提供分析函數,專門用於解決復雜報表統計需求的功能強大的函數,
-- 它可以在數據中進行分組然後計算基於組的某種統計值,並且每一組的每一行都可以返回一個統計值。分析函數用於計算基於組的某種聚合值。

-- 它和聚合函數的不同之處是:對於每個組返回多行,而聚合函數對於每個組只返回一行。普通的聚合函數用group by分組,
-- 每個分組返回一個統計值;而分析函數采用partition by分組,並且每組每行都可以返回一個統計值。

-- 1、分析函數的形式:
-- 分析函數帶有一個開窗函數over(),在窗口函數中包含三個分析子句:分組(partition by), 排序(order by), 窗口(rows) ,
-- 他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。 -- 註:窗口子句在這裏我只說rows方式的窗口,range方式和滑動窗口也不提。 -- 例如:統計函數+over()、排序函數+over()、數據分布函數+over()、統計分析函數+over()。 -- 2、開窗函數: 開窗函數指定了分析函數工作的數據窗口大小,這個數據窗口大小可能/*會隨著行的變化而變化*/。例如over函數 二、窗口函數 -- 窗口函數中常用的子句有:分區(partition by)、排序(order by)、範圍(rows between或range between),
-- 以及她們的混合方式。形式如下:over(partition by xxx order by yyy rows between zzz) 三、常見分析函數 -- row_number() over(partition by … order by …) -- rank() over(partition by … order by …) -- dense_rank() over(partition by … order by …) select deptno,sal,row_number() over(partition by deptno order by sal) num ,rank()
over(partition by deptno order by sal) rank ,dense_rank() over(partition by deptno order by sal) dens from emp; -- count() over(partition by … order by …) -- max() over(partition by … order by …) -- min() over(partition by … order by …) -- sum() over(partition by … order by …) -- avg() over(partition by … order by …) select deptno, sal, count(sal) over(partition by deptno order by sal) cn, max(sal) over(partition by deptno order by sal) mx, min(sal) over(partition by deptno order by sal) mn, avg(sal) over(partition by deptno order by sal) ag, sum(sal) over(partition by deptno order by sal) sm from emp; -- first_value() over(partition by … order by …) -- last_value() over(partition by … order by …) select deptno,sal,first_value(sal) over(partition by deptno order by sal) first ,last_value(sal) over(partition by deptno order by sal) last from emp; -- lag() over(partition by … order by …) -- lead() over(partition by … order by …) -- Lag和Lead函數可以在一次查詢中取出同一字段的前N行的數據和後N行的值。語法:lag(exp_str,offset,defval) over() -- exp_str 是要做對比的字段; -- offset 是exp_str字段的偏移量 比如說 offset 為2 則 拿exp_str的第一行和第三行對比,第二行和第四行,依次類推,offset的默認值為1! -- defval是當該函數無值可用的情況下返回的值。Lead函數的用法類似。 select deptno, sal, job, lag(job,2,1) over(partition by deptno order by sal) lg from emp;

原文鏈接https://lanjingling.github.io/2015/10/09/oracle-fenxihanshu-2/

分析函數之開窗函數over