【轉】oracle 分析函數中 keep關鍵字的使用

語法
min | max(column1) keep (dense_rank first | last order by column2) over (partion by column3);
 
另外first last還可以結合avg  sum等使用。
解釋:
返回按照column3分組後,按照column2排序的結果集中第一個或最後一個最小值或最大值column1。
 
實例:
 
create table tx2(id1 int ,id2 int,id3 int);
insert into tx2(id1,id2,id3)
values(1,111,1);
insert into tx2(id1,id2,id3)
values(1,222,1);
insert into tx2(id1,id2,id3)
values(1,333,2);
insert into tx2(id1,id2,id3)
values(1,444,3);
 
insert into tx2(id1,id2,id3)
values(2,555,1);
insert into tx2(id1,id2,id3)
values(2,666,2);
insert into tx2(id1,id2,id3)
values(2,777,3);
 
select  * from tx2;
ID1       ID2       ID3
1          111      1
1          222      1
1          333      2
1          444      3
2          555      1
2          666      2
2          777      3
 
SQL1,
按照ID1分組,ID3排序後,第一個最小的ID2,預期ID1=1的是111 ID1=2的是555。執行結果:
SELECT t.id1, t.id2, t.id3, MIN(t.id2) keep(dense_rank FIRST ORDER BY t.id3) over(PARTITION BY t.id1) AS minval FROM tx2 t;
ID1       ID2       ID3       MINVAL
1          111      1          111
1          222      1          111
1          333      2          111
1          444      3          111
2          555      1          555
2          666      2          555
2          777      3          555
SQL2,
按照ID1分組,ID3排序後,最後一個最小值ID2,預期ID1=1的是444,ID1=2的是777,。執行結果:
SELECT t.id1, t.id2, t.id3, MIN(t.id2) keep(dense_rank last ORDER BY t.id3) over(PARTITION BY t.id1) AS minval FROM tx2 t;
ID1       ID2       ID3       MINVAL
1          111      1          444
1          222      1          444
1          333      2          444
1          444      3          444
2          555      1          777
2          666      2          777
2          777      3          777
SQL3,
如果ID3有重複,比如ID1=1,ID3=1的兩個數據。此時
SELECT t.id1, t.id2, t.id3, MAX(t.id2) keep(dense_rank FIRST ORDER BY t.id3) over(PARTITION BY t.id1) as maxval FROM tx2 t;
 
預期結果ID1=1的值應爲444,可是
ID1       ID2       ID3       MAXVAL
1          111      1          222----------------結果好像是從ID3=1的分組中取出來的
1          222      1          222
1          333      2          222
1          444      3          222
1          888      3          222
2          555      1          555
2          666      2          555
2          777      3          555
SQL4,
同理,如果在使用LAST時,最後2個排序中ID3有重複,也會出現假分組的現象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章