二 理解over 函式

2021-06-23 05:40:42 字數 3845 閱讀 4803

1.1、兩個order by的執行時機

分析函式是在整個sql查詢結束後(sql語句中的order by的執行比較特殊)再進行的操作, 也就是說sql語句中的order by也會影響分析函式的執行結果:

a) 兩者一致:如果sql語句中的order by滿足分析函式分析時要求的排序,那麼sql語句中的排序將先執行,分析函式在分析時就不必再排序;

b) 兩者不一致:如果sql語句中的order by不滿足分析函式分析時要求的排序,那麼sql語句中的排序將最後在分析函式分析結束後執行排序。

1.2、分析函式中的分組/排序/視窗

分析函式包含三個分析子句:分組(partition by), 排序(order by), 視窗(rows)

視窗就是分析函式分析時要處理的資料範圍,就拿sum來說,它是sum視窗中的記錄而不是整個分組中的記錄,因此我們在想得到某個欄位的累計值時,我們需要把視窗指定到該分組中的第一行資料到當前行, 如果你指定該視窗從該分組中的第一行到最後一行,那麼該組中的每乙個sum值都會一樣,即整個組的總和。

視窗子句在這裡我只說rows方式的視窗,range方式和滑動視窗也不提。

視窗子句中我們經常用到指定第一行,當前行,最後一行這樣的三個屬性。

第一行是 unbounded preceding,

當前行是 current row,

最後一行是 unbounded following,

視窗子句不能單獨出現,必須有order by子句時才能出現,如:

last_value(sal) over(partition by deptno 

order

by sal

rows between unbounded preceding and unbounded following)

以上示例指定視窗為整個分組。而出現order by子句的時候,不一定要有視窗子句,但效果會很不一樣,此時的視窗預設是當前組的第一行到當前行!

當省略視窗子句時:

a) 如果存在order by則預設的視窗是unbounded preceding and current row --當前組的第一行到當前行

b) 如果同時省略order by則預設的視窗是unbounded preceding and unbounded following  --整個組

如果省略分組,則把全部記錄當成乙個組:

a) 如果存在order by則預設視窗是unbounded preceding and current row  --當前組的第一行到當前行

b) 如果這時省略order by則視窗預設為unbounded preceding and unbounded following  --整個組

1.3、幫助理解over()的例項

例1:關注點:sql無排序,over()排序子句省略

select deptno, empno, ename, sal, 

last_value(sal) over(partition by deptno)

from emp;

執行結果:

例2:關注點:sql無排序,over()排序子句有,視窗省略

select deptno,

empno,

ename,

sal,

last_value(sal) over(partition by deptno

order

by sal desc)

from emp;

執行結果:

例3:關注點:sql無排序,over()排序子句有,視窗也有,視窗特意強調全組資料

select deptno,

empno,

ename,

sal,

last_value(sal)

over(partition by deptno

order

by sal

rows between unbounded preceding and unbounded following) max_sal

from emp;

執行結果:

例4:關注點:sql有排序(正序),over()排序子句無,先做sql排序再進行分析函式運算

select deptno,

mgr,

ename,

sal,

hiredate,

last_value(sal) over(partition by deptno) last_value

from emp

where deptno =

30order

by deptno, mgr;

執行結果:

例5:關注點:sql有排序(倒序),over()排序子句無,先做sql排序再進行分析函式運算

select deptno,

mgr,

ename,

sal,

hiredate,

last_value(sal) over(partition by deptno) last_value

from emp

where deptno =

30order

by deptno, mgr desc;

執行結果:

例6:關注點:sql有排序(倒序),over()排序子句有,視窗子句無,此時的運算是:sql先選資料但是不排序,而後排序子句先排序並進行分析函式處理(視窗預設為第一行到當前行),最後再進行sql排序

select deptno,

mgr,

ename,

sal,

hiredate,

min(sal) over(partition by deptno order

by sal asc) last_value

from emp

where deptno =

30order

by deptno, mgr desc;

執行結果:

執行結果:

oracel 分析函式over 函式

表temp b的記錄 執行如下sql語句 剔除表temp a中city name相同的記錄 示例2 分組排序 成績表的所有記錄如下 執行如下sql語句 select student name,class,score,dense rank over partition by class order b...

oracle 分析函式OVER

分析函式用於計算基於組的某種聚合值,它和聚合函式的不同之處是 對於每個組返回多行,而聚合函式對於每個組只返回一行。over over order by.與over partition by.之間的區別 over order by.用在聚合函式 max sun 後面,可返回根據排序結果進行統計到當前行...

hive視窗函式 over

功能 既能顯示聚合前的資料 又能顯示聚合後的函式 執行順序 最後一步執行 僅僅位於order by 之前 select查詢中 存在多個視窗函式時 他們之間是沒有影響的,每個視窗應用自己規則 函式內容 over partition by 分組 在分組內進行操作 order by 預設從起點行到當前行。...