数据库LeetCode每日练习(三)

目录

前言

题目1:游戏玩法分析

题目2:订单最多的客户

题目3: 大的国家

题目4:连续出现的数字

题目小结


前言

  • 回顾前文精彩片段

数据库LeetCode每日练习(一)_小杰312的博客-CSDN博客sql操作LeetCode每日练习https://blog.csdn.net/weixin_53695360/article/details/123985354?spm=1001.2014.3001.5501数据库LeetCode每日练习(二)_小杰312的博客-CSDN博客数据库LeetCode每日练习(二)https://blog.csdn.net/weixin_53695360/article/details/124020795?spm=1001.2014.3001.5501

题目1:游戏玩法分析

511. 游戏玩法分析 I

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  • 题目要求: 获取每一个玩家的第一次登录平台的日期
  • 处理思路:第一次登录平台的日期, 竟然是第一次登录平台的日期, 那也就是对应的player_id中最小的event_date 了, 所以思路出来了,  直接一个聚合查询查询min(date) 即可   
  • 如何想到使用聚合查询, 首先存在多个登录日期, 但是我们仅仅需要最小的哪一个, 于是想到了通过聚合查询进行压缩处理,   结合一下聚合函数使用即可,常用的聚合函数附在如下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

select 
    player_id,
    min(event_date) as 'first_login'  
from 
    activity
group by 
    player_id;

题目2:订单最多的客户

586. 订单最多的客户

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_14,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 获取订单最多的客户
  • 思考方向: 我们需要获取订单数最多的客户, 首先第一步就是计算出来订单数, 计算订单数自然需要聚合查询, count(customer_number) 或者 count(*) 来获取订单数, 然后直接按照订单数从大到小排序, 第一条就是需要的max 订单数客户       (获取最大,第几大, 第几小 一定想到 sort  +  limit分页)
select 
    customer_number
from 
    orders
group by customer_number
order by count(*) desc
limit 0, 1; # 获取第一条记录

题目3: 大的国家

595. 大的国家

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 需要我们按照如下规则筛选出来大国

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  解题思路: 特别的简单, 直接一个where 条件查询筛选大国即可实现
select 
    name, population, area
from 
    world
where 
    area >= 3000000 or population >= 25000000;
-- where 条件筛选大国

题目4:连续出现的数字

180. 连续出现的数字

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_17,color_FFFFFF,t_70,g_se,x_16

  • watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_13,color_FFFFFF,t_70,g_se,x_16
  • 题目要求:1. 连续出现    2. 出现三次
  • 因为需要从同一张表中找,只有一张表, 关系是表中连续三次出现的重复num的记录, 所以其实很容易想到可以通过自联结查询.    然后查询的过程中肯定会出现重复, 因为相当于是同一张表自己跟自己连接两次.       故而需要进行一个distinct
select distinct
    l1.num as 'ConsecutiveNums'    -- 'consecutivenums'题目要求别名
from 
    logs l1 inner join logs l2 on l1.num = l2.num
    inner join logs l3 on l1.num = l3.num
    # 子连接关系条件满足同一个num
where 
    l1.id = l2.id + 1 && l2.id = l3.id + 1; 
    -- where条件保证连续记录

题目小结

  • 查找重复出现记录数我们需要想到 聚合查询, 因为聚合查询可以做到压缩相同关键字聚合操作。
  • 查找第几大或者小记录 我们需要想到可以使用 sort + limit 分页
  • 多表连接操作不限表的数量, 甚至可以三表,四表同时连接,只是数量过多之后一般不建议这样书写了,需要另辟蹊径, 因为你写都写不下了  

  • 67
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 90
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杰312

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值