zoukankan      html  css  js  c++  java
  • oracle 分析函数中 keep关键字的使用

    语法

    min | max(column1keep (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) ASminval 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 minvalFROM 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) asmaxval 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有重复,也会出现假分组的现象。
  • 相关阅读:
    01--DNS服务器3
    01--DNS服务器2
    装配bean
    实现二级域名
    apache反向代理
    struts拓展restful
    restful是什么
    struts的声明式异常处理
    linux常用命令之压缩打包
    linux常用命令之文件系统
  • 原文地址:https://www.cnblogs.com/haoerlv/p/7234790.html
Copyright © 2011-2022 走看看