美文网首页
排序问题的一种SQL思路

排序问题的一种SQL思路

作者: 一根薯条 | 来源:发表于2019-02-15 08:40 被阅读0次

    177. 第N高的薪水

    编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |
    +----+--------+
    

    例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。

    +------------------------+
    | getNthHighestSalary(2) |
    +------------------------+
    | 200                    |
    +------------------------+
    

    解法:

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
      RETURN (
          -- 给Employee起别名让其作为一个新表,然后遍历表中的记录,只有当Salary为结果所需的数值时,where条件的N=(count(xxx))成立
          select distinct Salary from Employee e where N = (select count(distinct Salary) from Employee where Salary >= e.Salary)
      );
    END
    

    178. 分数排名

    编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

    +----+-------+
    | Id | Score |
    +----+-------+
    | 1  | 3.50  |
    | 2  | 3.65  |
    | 3  | 4.00  |
    | 4  | 3.85  |
    | 5  | 4.00  |
    | 6  | 3.65  |
    +----+-------+
    

    例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00  | 1    |
    | 4.00  | 1    |
    | 3.85  | 2    |
    | 3.65  | 3    |
    | 3.65  | 3    |
    | 3.50  | 4    |
    +-------+------+
    

    解法:

    SELECT 
    --思路同上
            Score, 
            (SELECT COUNT(DISTINCT score)
            FROM Scores
            WHERE score >= s.score
        ) AS Rank
    FROM Scores s
    ORDER BY Score DESC;
    

    不知各位看官看出点什么没,select count(distinct Salary) from Employee where Salary >= e.Salary 这个SQL是个固定的套路,可以用于求排名这类的SQL问题上。

    相关文章

      网友评论

          本文标题:排序问题的一种SQL思路

          本文链接:https://www.haomeiwen.com/subject/cynueqtx.html