zoukankan      html  css  js  c++  java
  • 23、对所有员工的薪水按照salary进行1-N的排名

    1、题目描述

    对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));

    输入描述:

    输出描述:

    emp_nosalaryrank
    10005 94692 1
    10009 94409 2
    10010 94409 2
    10001 88958 3
    10007 88070 4
    10004 74057 5
    10002 72527 6
    10003 43311 7
    10006 43311 7
    10011 25828

    2、代码:这道题主要难点就是rank列如何生成,只有一个表,那就使用自关联,这样可以添加过滤条件,a.salary<=b.salary,从而用count(distinct b.salary),就可以生成排名了,其思想就是对每一个工资,求他的排名就是求有多少是小于等于它的值的工资即可,最后进行去重,因为排名是从1开始,因此边界条件要加上=。

    select a.emp_no,a.salary,count(distinct b.salary) as rank 
    from salaries a join salaries b
    on a.to_date='9999-01-01' and b.to_date='9999-01-01' and a.salary<=b.salary
    group by a.emp_no
    order by a.salary desc,a.emp_no asc;

    链接:https://www.nowcoder.com/questionTerminal/b9068bfe5df74276bd015b9729eec4bf?f=discussion
    来源:牛客网

    本题的主要思想是复用salaries表进行比较排名,具体思路如下:

    1、先对一张表的salary进行排序

     
    1
    2
    3
    4
    5
    6
    7
    select  emp_no ,salary
     
    from salaries
     
    where to_date = '9999-01-01'
     
    order by salary desc;

    2、进行并列操作,加入 count

     
    1
    2
    3
    4
    5
    6
    7
    select  emp_no ,salary,count(salary)
     
    from salaries
     
    where to_date = '9999-01-01'
     
    order by salary desc;

    3.这样只是统计了,这个salary出现的次数,并没有依照次序进行排序,要进行次序的排序,必须count,大于等于该条salary的数据条数,又因为数据有重复,所以distinct,此处必须使用表的重复使用功能

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  a.emp_no ,a.salary,
     
    count(distinct b.salary)
     
    from salaries as a,salaries as b
     
    where a.to_date = '9999-01-01'
     
    and b.to_date ='9999-01-01'
    and a.salary<= b.salary
     
    order by salary desc;

    3、因为使用了合计函数导致,count只返回一个值,表a选择返回的值却有好几个,所以必须进行分组查询

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select  a.emp_no ,a.salary,
     
    count(distinct b.salary)
     
    from salaries as a,salaries as b
     
    where a.to_date = '9999-01-01'
     
    and b.to_date ='9999-01-01'
    and a.salary<= b.salary
     
    group by a.emp_no
    order by salary desc;

    4、最后在s1.salary 逆序排之后,再以 s1.emp_no 顺序排列输出结果,必须满足第一个条件的情况下,满足第二个排序条件,等于进行的是相同的rank,数据有重复的值进行了emp_no的排序

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    最终结果
    select  a.emp_no ,a.salary,
     
    count(distinct b.salary)
     
    from salaries as a,salaries as b
     
    where a.to_date = '9999-01-01'
     
    and b.to_date ='9999-01-01'
    and a.salary<= b.salary
     
    group by a.emp_no
    order by a.salary desc,a.emp_no asc;
  • 相关阅读:
    【BZOJ4472】salesman(树形DP)
    【CF314C】Sereja and Subsequences(DP,树状数组)
    KMP模板
    【vijos1144】小胖守皇宫(树形DP)
    【CF696B】Puzzles(树形DP,期望)
    纪录一个table元素里面的tr th td
    css动态样式
    动态脚本,在js里面又写js
    DOM---documentFragment
    DOM----comment类型
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12272379.html
Copyright © 2011-2022 走看看