語法
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有重複,也會出現假分組的現象。
【轉】oracle 分析函數中 keep關鍵字的使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.