• leetcode 数据库十题记录


    题目从难到易记录。解题过程中,如果不太熟悉,可以将题目中的表自己手动录入到自己的数据库中,就方便学习,测试。

    185. Department Top Three Salaries

    要求就是查询出每个部门工资在前三的人。题意值得注意的一点就是,要求找出的是工资数前三的人,而不是工资最高的前三位。区别就是前者查询出来的人可能大于3,而后者最大只能为3.
    最终答案:

    select b.Name Department,a.Name Employee,a.Salary from 
        (select Name,if(@de=DepartmentId,if(@sa!=Salary,@in:=@in+1,@in),@in:=1) rank,@de:=DepartmentId DepartmentId,@sa:=Salary Salary from 
            Employee,(select @in:=0,@de) tmp 
        order by DepartmentId asc,Salary desc) a 
    right join Department b on a.DepartmentId=b.Id where a.rank<=3
    

    思路:
    1. 对每个部门的人按照工资的从高到低排序
    2. 排序之后要对每个部门进行编号,使用mysql标量。此编号就类似成绩单,最高的第一,依次排序,如果工资一样,那么编号也一样。
    3. 最后选择出编号小于或等于3的人
    其中:

    if(@de=DepartmentId,if(@sa!=Salary,@in:=@in+1,@in),@in:=1)
    ## 这里的意思就是还需要根据部门来编号
    ## 如果部门相同,则对比工资的大小,如果工资一样,则编号不变,否则+1
    ## 如果部门不同,则编号直接赋值为1
    
    

    262. Trips and Users

    题目要求是查询出2013-10-01至2013-10-03期间,未绑定用户的取消率。注意的是,此取消率的求法:未绑定用户取消数/未绑定用户的总请求数

    最终答案:

    select t.Request_at Day, round(ifnull(t1.c/t2.s,0),2) 'Cancellation Rate' from Trips t left join 
        (select count(t.id) c, t.Request_at from Trips t left join Users u on t.Client_Id=u.Users_Id where Status!='completed' and u.Banned='No' group by Request_at) t1 
    on t.Request_at=t1.Request_at left join 
        (select count(t.id) s, t.Request_at from Trips t left join Users u on t.Client_Id=u.Users_Id where u.Banned='No' and u.role='client' group by t.Request_at) t2 
    on t.Request_at=t2.Request_at 
    where t.Request_at between '2013-10-01' and '2013-10-03' group by t.Request_at
    

    思路:
    1.明确取消率的求法
    2.构建两个临时表,一个可以得出未绑定用户的取消数,另一个可以得出未绑定用户的总请求数
    3.加上日期等条件就可以得出结果

    177. Nth Highest Salary

    题目给出Employee表,要求找出表中第n高的工资,如果不存在则返回null,并且用function 来完成

    最终答案:

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
        declare m int;
        set m=N-1;
      RETURN (
          select ifnull((select distinct(Salary) from Employee order by Salary desc limit m,1),null)
      );
    END
    

    思路:
    1.第N高,那么应该使用limit来筛选结果
    2.配合ifnull函数,若不存在则返回null

    184. Department Highest Salary

    题目给出Empployee和Department表,要求查询出每个部门的拿最高工资的人。
    最终答案:

    select c.Name Department,d.Name Employee,c.Salary from 
        (select max(a.Salary) Salary,b.Name,a.DepartmentId from Employee a 
            inner join Department b 
            on a.DepartmentId=b.Id group by a.DepartmentId) c,
        Employee d 
        where d.Salary=c.Salary and d.DepartmentId=c.DepartmentId
    

    思路:
    1. 使用group by搭配上max()函数就可以找出每个部门的最高工资的那个人
    2. 表连接时使用inner join是因为left join在某个测试用例中,一些字段为null值

    180. Consecutive Numbers

    题目给出Logs表,要求查找出Num字段中,连续出现至少3次的数字
    最终答案:

    select distinct(a.Num) ConsecutiveNums from 
        Logs a,Logs b,Logs c 
        where a.Num=b.Num and a.Num=c.Num and a.Id+1=b.Id and b.Id+1=c.Id
    

    思路:
    1.连续出现,那么就判断一下对于连续的Id值,他的Num值是不是一样的

    178. Rank Scores

    题目给出Score表,要求对表进行排名,score值相同的排名也相同,除此之外排名的名次要求全部都是连续的。
    最终答案:

    select c.score Score,d.rank Rank from 
        (select a.score,@i:=@i+1 rank from 
            (select distinct score from Scores order by score desc) a,(select @i:=0) b) d, 
        Scores c where c.score=d.score order by score desc
    

    思路:
    1.需要注意题意的是,分数相同的排名相同,除此之外,排名要求全部是连续的
    2.先对score去重之后,借助变量来对score进行排名,将结果放入临时表中
    3.最后就可以根据分数来查询出名次

    196. Delete Duplicate Emails

    题目给出Persion表,其中有Email字段,要求删除重复的Email
    最终答案:

    delete a from Person a,Person b where a.Id>b.Id and a.Email=b.Email
    

    思路:
    1.就是找出Email值相同而Id值不同的那条数据,并删除

    176. Second Highest Salary

    题目给出Employee表,要求找出第二高的工资
    最终答案:

    select ifnull((select distinct(Salary) from Employee order by Salary desc limit 1,1),null) SecondHighestSalary
    

    思路:
    1.排序后使用limit
    2.注意结果需要处理null的情况

    197. Rising Temperature

    题目给出Weather表,要求找出升温那天的Id值,升温是指当天的温度与其前一天的温度比较,升高了的。
    最终答案:

    select a.Id from Weather a,Weather b where datediff(a.Date,b.Date)=1 and a.Temperature>b.Temperature
    

    思路:
    1.如果知道datediff这个函数,那么会很好求
    2.我开始也不知道有这个函数,但是知道要用日期函数,于是去找相关函数时发现的这个函数。

    183. Customers Who Never Order

    题目给出两张表:Customers,Order。要求找出没有订购过任何东西的customer
    最终答案:

    select Name as Customers from Customers where Id not in(select distinct(CustomerId) from Orders)
    

    思路:
    1.使用表连接一样可以解决

    175. Combine Two Tables

    题目给出Persion表和Address表,要求找出Persion表中的人的FirstName,LastName,City,State,不用管这个人是否有Address
    最终答案:

    select a.FirstName,a.LastName,b.City,b.State from Person a left join Address b on a.PersonId=b.PersonId
    

    181. Employees Earning More Than Their Managers

    题目给出Employee表,要求找出工资比他的领导还高的员工
    最终答案:

    select a.Name as Employee from Employee a left join Employee b on a.ManagerId=b.Id where a.Salary>b.Salary
    

    182. Duplicate Emails

    给出Persion表,要求找出所有重复的email
    最终答案:

    select Email from Person group by Email having count(Email)>1
    

    思路:
    1. group by having是用来对查询之后的结果进行筛选的

  • 相关阅读:
    centos7 安装mysql
    Nginx安装及配置详解
    nginx安装
    JSON Web Token
    优先队列
    小程序遮罩层禁止页面滚动(遮罩层内部可以滚动)
    H5中接入微信支付
    如何使用less预编译
    在methods中使用filter
    根据当前时间获取上一个月的时间
  • 原文地址:https://www.cnblogs.com/bencakes/p/6271076.html
Copyright © 2020-2023  润新知