Leetcode D2
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
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
后面有人提出另外的方法,是使用变量来做的。之后在总结.
因为是连续出现三次,所以就自链接了3次。
那么对于一共出现3次该怎么实现呢,可不可以首先通过把num排序,然后重新给予rank,然后再通过上面的方式来实现?
那么对于连续出现或者一共出现100次呢,如果是按照上面的方法来做肯定效率不高,因为要自链接100次。在后面有人就想了另外一个方法。通过分区排序来做。但是这个我不太懂啦
这个一共就是三步:
- 分区排序
- 原本序号 — 分区排序序号
- 通过寻找分组排序(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