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有重复,也会出现假分组的现象。
  • 相关阅读:
    Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
    Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
    Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
    linked-list-cycle-ii-LeetCode
    reorder-list-LeetCode
    sum-root-to-leaf-numbers-LeetCode
    binary-tree-maximum-path-sum-LeetCode
    机器人的运动范围-剑指Offer
    矩阵中的路径-剑指Offer
    滑动窗口的最大值-剑指Offer
  • 原文地址:https://www.cnblogs.com/haoerlv/p/7234790.html
Copyright © 2011-2022 走看看