• ORACLE中的KEEP()使用方法


    转载至:http://blog.csdn.net/aqszhuaihuai/article/details/6434160

    ==============================================

    2种取值:
    DENSE_RANK FIRST 
    DENSE_RANK LAST

    SQL> select * from test;

    ID MC SL
    -------------------- -------------------- -------------------
    1 111 1
    1 222 1
    1 333 2
    1 555 3
    1 666 3
    2 111 1
    2 222 1
    2 333 2
    2 555 2

    9 rows selected

    SQL> 
    SQL> select id,mc,sl,
    2 min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
    3 max(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id)
    4 from test
    5 ;

    ID MC SL MIN(MC)KEEP(DENSE_RANKFIRSTORD MAX(MC)KEEP(DENSE_RANKLASTORDE
    -------------------- -------------------- ------------------- ------------------------------ ------------------------------
    1 111 1 111 666
    1 222 1 111 666
    1 333 2 111 666
    1 555 3 111 666
    1 666 3 111 666
    2 111 1 111 555
    2 222 1 111 555
    2 333 2 111 555
    2 555 2 111 555

    9 rows selected

    SQL>

    不要混淆keep内(first、last)外(min、max或者其他):
    min是可以对应last的
    max是可以对应first的
    SQL> select id,mc,sl,
    2 min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
    3 max(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
    4 min(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id),
    5 max(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id)
    6 from test
    7 ;

    ID MC SL MIN(MC)KEEP(DENSE_RANKFIRSTORD MAX(MC)KEEP(DENSE_RANKFIRSTORD MIN(MC)KEEP(DENSE_RANKLASTORDE MAX(MC)KEEP(DENSE_RANKLASTORDE
    -------------------- -------------------- ------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------
    1 111 1 111 222 555 666
    1 222 1 111 222 555 666
    1 333 2 111 222 555 666
    1 555 3 111 222 555 666
    1 666 3 111 222 555 666

    2 111 1 111 222 333 555
    2 222 1 111 222 333 555
    2 333 2 111 222 333 555
    2 555 2 111 222 333 555

    对于id=1的结果集进行一下解释
    min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id):id等于1的数量最小的(DENSE_RANK first )为
    1 111 1 
    1 222 1 
    在这个结果中取min(mc) 就是111
    max(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id)
    max(mc) 就是222;
    min(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id):id等于1的数量最大的(DENSE_RANK first )为
    1 555 3 
    1 666 3

    在这个结果中取min(mc) 就是555,取max(mc)就是666

    id=2的结果集同理

  • 相关阅读:
    四则运算网页版
    第六周工作日志
    课堂作业数组最大和
    第五周总结
    四则运算三结对开发
    学习进度第四周
    个人模块记录表
    学习进度表第三周
    四则运算第二篇
    保序回归问题
  • 原文地址:https://www.cnblogs.com/wllcs/p/6178192.html
Copyright © 2020-2023  润新知