• 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有重复,也会出现假分组的现象。
  • 相关阅读:
    迷你版jQuery——zepto核心源码分析
    zepto.js 源码解析
    zepto.js swipe实现触屏tab菜单
    zepto.js 处理Touch事件
    Zepto 使用中的一些注意点(转)
    判断js对象的数据类型,有没有一个最完美的方法?
    html 5 本地数据库(Web Sql Database)核心方法openDatabase、transaction、executeSql 详解
    HTML5本地存储——Web SQL Database
    js事件监听器用法实例详解-注册与注销监听封装
    10 个非常有用的 AngularJS 框架
  • 原文地址:https://www.cnblogs.com/haoerlv/p/7234790.html
Copyright © 2020-2023  润新知