【转】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有重复,也会出现假分组的现象。

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