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有重复,也会出现假分组的现象。
  • 相关阅读:
    Day 7 测试用例设计(二)场景流程分析法、正交表法、状态迁移法、
    Day 6 测试用例设计(一)等价类、边界值、判定表、因果图
    Day 5 网络基础 & SVN的使用
    Day 4 shell脚本
    gitlab-runner (一)
    大数据(二)Elasticsearch 分布式搜索引擎(存索引、索引搜索)
    大数据(一)from 北鼻 消息中间件 + 数据计算+数据存储=数据管理
    关系型数据库、非关系型数据库
    SVN 版本管理工具 Gitlab 仓库管理系统 Git 代码管理工具
    Day 2 & 3 linux常用命令, vim
  • 原文地址:https://www.cnblogs.com/haoerlv/p/7234790.html
Copyright © 2011-2022 走看看