ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

数据库相关算法题 V2

2026/9/8 10:09:30 拓冰建站 浏览量
数据库相关算法题 V2

游戏玩法分析1

在本题中,如何在group中取第一次登陆日期将是难点所在。

为了解决这点我们可以用上聚合函数min()去做到,如果不用的话,将会导致取到顺序的第一个登陆日期,而不是我们期待的第一次登陆日期,

SELECTA.player_id,MIN(A.event_date) AS first_login
FROMActivity A
GROUP BYA.player_id;

https://leetcode.cn/problems/game-play-analysis-i/description/

分数排名

如何输出相应的rank?

  • 以大于本分数的数量作为rank

    SELECTS1.score,(SELECTCOUNT(DISTINCT S2.score)FROMScores S2WHERES2.score >= S1.score) AS 'rank'
    FROMScores S1
    ORDER BYS1.score DESC;
    -- 此外值得注意的是rank要用上引号,否则会报错
    
  • 采用DENSE_RANK窗口函数

    SELECTS.score,DENSE_RANK() OVER (ORDER BYS.score DESC) AS 'rank'
    FROMScores S;
    
  • 与方法1思想类似,也是统计大于等于分数的个数,只不过是采用同表连接

    SELECTS.score,COUNT(DISTINCT T.score) AS 'rank'
    FROMScores SINNER JOIN Scores T ON S.score <= T.score
    GROUP BYS.id,S.score
    ORDER BYS.score DESC;
    

https://leetcode.cn/problems/rank-scores/description/

2016年的投资

两个条件就是两个子查询,我们只需要在子查询中找到所有满足条件的数据就可以了

SELECTROUND(SUM(insurance.TIV_2016), 2) AS TIV_2016
FROMinsurance
WHEREinsurance.TIV_2015 IN(SELECTTIV_2015FROMinsuranceGROUP BY TIV_2015HAVING COUNT(*) > 1)AND CONCAT(LAT, '.', LON) IN(SELECTCONCAT(LAT, '.', LON)FROMinsuranceGROUP BY CONCAT(LAT, '.', LON)HAVING COUNT(*) = 1)

https://leetcode.cn/problems/investments-in-2016/description/

连续出现的数字

本题关键在于如何判断数字是连续出现的,诀窍在于采用三表连接,表a、b、c的id分别是连续的,并且num相等

SELECT *
FROMLogs a,Logs b,Logs c
WHEREa.Id = b.Id - 1AND b.Id = c.Id - 1AND a.Num = b.NumAND b.Num = c.Num

https://leetcode.cn/problems/consecutive-numbers/description/

至少有5名直接下属的经理

  • 子查询方法

    SELECT name FROM Employee WHERE id in (SELECT managerId FROM Employee GROUP BY managerId HAVING count(*)>=5)
    
  • join

    select Manager.Name as Name
    from
    Employee as Manager join Employee as Report
    on Manager.Id = Report.ManagerId
    group by Manager.Id
    having count(Report.Id) >= 5
    

https://leetcode.cn/problems/managers-with-at-least-5-direct-reports/solutions/2366332/zhi-shao-you-5ming-zhi-jie-xia-shu-de-ji-syvu/