Leetcode SQL题目D2 177\178\180

Leetcode D2

  1. 求第n高的工资
    我首先想到的是用limit来取一个值,但是第n高的工资应该是limit n-1,1。所以应该首先重新定义一个变量为a = n-1。所以我给出的答案是:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
     BEGIN
         declare a int;
         set a = n-1;
       RETURN (
           # Write your MySQL query statement below.
           select distinct salary as getNthHighestSalary
           from employee
           order by salary DESC
           limit a,1
       );
     END

但是我觉得这个方法其实还有问题。因为题目中给出的write answer的地方在return后面,但是去过按照我的方法其实会在return前也有修改。所以就有另外的一种思路,取前几高后求最小,和数学里面的MIN(MAX(x1,x2))感觉很像。中间运用了子查询的知识,每个查询要有自己的名字。

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
     BEGIN
       RETURN (
           # Write your MySQL query statement below.
          select if(n > count, null ,min)
          from (select min(salary) min , count(1) count
                  from (select distinct salary
                         from employee
                         order by salary desc
                         limit n) a
                         ) b
       );
     END
  1. 分数排名
    这题对于我很难。首先可以分为两部分来解决,第一部分是按分数排名:
select score from scores order by score DESC

但是后面的按照分数排名,且分数相同的同学排名相同,我是一点思路都没有。所以本菜鸡就去看了其他大佬的解答。其中有一个大佬(@JohnBear)的思路清奇,但是比较容易理解。就是分数的排名可以通过这个分数本身的排名来进行。比如一个班的分数为99,99,98,98,98,97,96,94,94。如果我是94分,可重复排名我就是第五名:首先去重后的分数为99,98,97,96,94,即比94分大于等于的分数个数有5个,所以94分为第五名。感觉这个思路特别好。很厉害,那么就可以得到MySQL的代码为:

select x.score Score,
       (select count(distinct y.score) 
              from scores y
              where y.score >= x.score) Rank
     from scores x
     order by x.score DESC

后面有人提出另外的方法,是使用变量来做的。之后在总结.

  1. 连续出现的次数
    再一次一点思路都没有。所以去偷偷看了官方解题思路。官方的思路其实对于这个题目要更简单一点,因为官方默认num相同的数字的id相同,也就是说连续出现多次的数字的位置是相邻的。但是在显示生活中可能不行。但是首先按照官方的思路梳理了一下:
    在这里插入图片描述

因为是连续出现三次,所以就自链接了3次。
🙂那么对于一共出现3次该怎么实现呢,可不可以首先通过把num排序,然后重新给予rank,然后再通过上面的方式来实现?
🙂那么对于连续出现或者一共出现100次呢,如果是按照上面的方法来做肯定效率不高,因为要自链接100次。在后面有人就想了另外一个方法。通过分区排序来做。但是这个我不太懂啦
在这里插入图片描述
这个一共就是三步:

  1. 分区排序
  2. 原本序号 — 分区排序序号
  3. 通过寻找分组排序(num,a-b)相同的个数,只要个数大于等于3,就是重复出现了3次及以上

代码也很复杂哇

select distinct num as ConsecutiveNums
     from (select num,count(*) num_count
          from (select id,num
               row_number() over (order by id) - row_number()
               over (partition by num order by id) as orde
               from logs) as A
       group by num,orse) as B
     where num_count >=3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值