zoukankan      html  css  js  c++  java
  • oracle——分析函数——排序值分析函数

    一、问题描述

      查询列表时,我们有时需要对查询结果依据某个字段进行排名。

      如果每条记录在排序字段上都不相同,我们可以将原查询作为一个视图,查询其rownum,便可以实现简单排序,例如:

    select rownum,e.* from emp e;

      但是,很多时候我们想用来排序的字段都是有重复值的,此时可能需要将值相同的记录名词并列,那么我们就需要用到oracle的分析函数了。

    二、解决

      1.排序字段相同的名次并列,且所有名次连续

    select dense_rank() over(order by sal desc) rk,e.ename,e.sal
    from emp e;

    3000元的员工有两个,他们的名词并列,且下一个用户的名词连续计数(区别于2)

      2.排序字段相同的名次并列,且下一个名次是跳跃排序的,比如,有两个第二名时,下一个就是第四名

    select rank() over(order by sal desc) rk,e.ename,e.sal
    from emp e;

    三、其他

      有时,我们需要将不同部门下的员工进行排名,此时,我们需要使用

    row_number() over(partition by column1 order by column2)

      按照column1分组,然后在组内,按照column2排序。

    select row_number() over(partition by e.job order by e.sal) rk,e.job,e.ename,e.sal
    from emp e;

    四、扩展

      需求:统计用户签到排名

      

      每个用户每次签到生成一条数据,统计每个用户签到的总次数然后排名,为用户显示签到排名。

    1.连续排名,相同次数的用户名次并列

    select dense_rank()over(order by cnt desc) RANKING,b.* from ( 
    select count(1) cnt, user_id    
    from MIC_TD_EXERCISE_SIGNIN group by user_id order by cnt DESC) b;

    2.不连续排名

    select rank() over(order by cnt desc) ranking,b.* from ( 
    select count(1) cnt, user_id    
    from MIC_TD_EXERCISE_SIGNIN group by user_id order by cnt DESC) b;

  • 相关阅读:
    vue this,$set方法
    表格的拖拽排序功能---应用splice方法
    ES6方法的特性总结
    template functional
    scrollTop, offsetTop, pageYOffset, scrollY 的区别
    Sass @mixin 与 @include
    关于Vue中props的详解
    前端开发工具宝典
    前端js开发常用的60种工具方法
    element ui table表格里面插槽的使用方法
  • 原文地址:https://www.cnblogs.com/brolanda/p/4686065.html
Copyright © 2011-2022 走看看