ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 分析函数中 keep关键字的使用

oracle 分析函数中 keep关键字的使用

原创 Linux操作系统 作者:sieper 时间:2011-04-22 13:39:20 0 删除 编辑

语法

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的是444ID1=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=1ID3=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有重复,也会出现假分组的现象。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11813230/viewspace-693153/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-17

  • 博文量
    87
  • 访问量
    195587