1. 程式人生 > >窗口函數/解析函數

窗口函數/解析函數

value 標準差 log 參數 ear select語句 tro 最小 bound

分析函數是以一定的方法在一個與當前行相關的結果子集中進行計算,也稱為窗口函數。

Function(arg1 , arg2 ……) over(partition by clause order by clause windowing clause )

1.over分區條件中的列可以不在select列表中,但是必須在數據源中。
2.over排序條件中的列可以不在select列表中,但是必須在數據源中。
3.over排序條件是對所在分區中的數據進行排序,與select語句中的排序無關。但是會影響到分析函數的結果。
4.over中的開窗條件的範圍一般僅限於分區本身。rows between unbounded preceding and current row
表示從分區的最開始到當前行。
5.分析函數的數據來自結果集(施加了where條件之後的)。

Lead和Lag(不支持開窗的函數)

LEAD是求下一個,LAG求上一個

Lead和lag函數的第一參數為返回的列,第二參數為相隔行數(非負),第三個參數為不存在時的默認值(可以指定為當前行的值)

FIRST_VALUE和LAST_VALUE

這兩個函數都可以與order by條件配合得到最大值和最小值。
First_value返回窗口中的第一個值。Ignore nulls表示忽略空值,如果第一個是空值返回第二個。

NTH_VALUE訪問分區別的任意指定行

FIRST_VALUE相當於NTH_VALUE(sale , 1 )或者NTH_VALUE(sale , 1 )from first respect nulls。
可以與排序配合求第幾大,第幾小。

Ratio_to_report(當前行的值與分區總和的比值)

這個函數不支持排序和開窗。

Percent_rank(排在前百分之幾)

當前行的排名的相對百分位置。

Percentile_cont(大體意思求排在某個百分比時所需的數值)

Percentile_disc(功能與Percentile_cont大體相同)

NTILE(類型於建立直方圖,不支持開窗)

Stddev計算標準差(方差的平方根,支持開窗)

Listagg(把分區中的列按照順序拼接起來,不支持開窗)

高級排序函數:

[ ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx)


1.row_number() 連續且遞增的數字 1 2 3 4
row_number() over (partition by xx order by xx )
--學生表中按照所在專業分組,同專業內按成績倒序排序,成績相同則按學號正序排序,並給予組內等級
select row_number() over(partition by class_id order by score desc)rn,t.* from student2016 t
2.rank() 跳躍排序 若有相同數據則排名相同 然後跳躍排序 1 2 2 2 5
rank() over (partition by xx order by xx )
select rank() over(partition by class_id order by score desc)rn,t.* from student2016 t
3.dense_rank 若有相同數據則排名相同 然後遞增排序
dense_rank over (partition by xx order by xx ) 1 2 2 2 3
select dense_rank() over(partition by class_id order by score desc)rn,t.* from student2016 t

高級分組函數

group by rollup(a,b,c)

select a,b,c,sum(d) from test group by rollup(a,b,c)

對rollup後面的列 按從右到左以少一列的方式進行分組直到所有列都去掉後的分組(也就是全表分組)
對於n個參數的 rollup,有n+1次分組

即按a,b,c,分組,union all a,b分組 union all a分組 union from test

----------------------------------------------------------------------------------

group by cube(a,b,c)

對n個參數,有2^n次分組

即按 ab,ac,a,bc,b,c最後對 全部分組

----------------------------------------------------------------------------------

group by grouping sets(a,b)

即只列出 對 a分組後,和對 b分組的結果集

窗口函數/解析函數