【LeetCode高频SQL50题-基础版】打卡第4天:第21~25题

news2025/1/23 0:46:57

文章目录

  • 【LeetCode高频SQL50题-基础版】打卡第四天:第21~25题
    • ⛅前言
    • 即时食物配送II
      • 🔒题目
      • 🔑题解
    • 游戏玩法分析IV
      • 🔒题目
      • 🔑题解
    • 每位教师所教授的科目种类的数量
      • 🔒题目
      • 🔑题解
    • 查询近30天活跃用户数
      • 🔒题目
      • 🔑题解
    • 销售分析III
      • 🔒题目
      • 🔑题解

【LeetCode高频SQL50题-基础版】打卡第四天:第21~25题

⛅前言

  在这个博客专栏中,我将为大家提供关于 LeetCode 高频 SQL 题目的基础版解析。LeetCode 是一个非常受欢迎的编程练习平台,其中的 SQL 题目涵盖了各种常见的数据库操作和查询任务。对于计算机科班出身的同学来说,SQL 是一个基础而又重要的技能。不仅在面试过程中经常会遇到 SQL 相关的考题,而且在日常的开发工作中,掌握 SQL 的能力也是必备的。

  本专栏的目的是帮助读者掌握 LeetCode 上的高频 SQL 题目,并提供对每个题目的解析和解决方案。我们将重点关注那些经常出现在面试中的题目,并提供一个基础版的解法,让读者更好地理解问题的本质和解题思路。无论你是准备找工作还是提升自己的技能,在这个专栏中,你可以学习到很多关于 SQL 的实践经验和技巧,从而更加深入地理解数据库的操作和优化。

  我希望通过这个专栏的分享,能够帮助读者在 SQL 的领域里取得更好的成绩和进步。如果你对这个话题感兴趣,那么就跟随我一起,开始我们的 LeetCode 高频 SQL 之旅吧!

  • 博客主页💖:知识汲取者的博客
  • LeetCode高频SQL100题专栏🚀:LeetCode高频SQL100题_知识汲取者的博客-CSDN博客
  • Gitee地址📁:知识汲取者 (aghp) - Gitee.com
  • 题目来源📢:高频 SQL 50 题(基础版) - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

即时食物配送II

🔒题目

题目来源:1174.即时食物配送II

image-20231009115649683

🔑题解

  • 考察知识点子查询mingroup byroundsumcount

    除了min以外几个在之前的文章中都有介绍了

    • min(column_name):返回不同列值当中的最小值

      这个一般可以搭配 group bydistinct 使用,本题中是搭配 group by 进行使用

1)首先审题,我们明确题目是让我们查询 用户首次订单中即时订单的占比,这里需要理解首次订单即时订单的含义,首次订单是指用户最早下的单,即时订单是指预定时间(order_date)和实际时间(customer_pref_delivery_date)相等的订单。

所以我们首先需要确定用户所有的首次订单,这里我们使用 group by 和 min 得到

select customer_id, min(order_date)
from delivery
group by customer_id;
| customer_id | min(order_date) |
| ----------- | --------------- |
| 1           | 2019-08-01      |
| 2           | 2019-08-02      |
| 3           | 2019-08-21      |
| 4           | 2019-08-09      |

2)只要我们得到上面那张表,后面操作起来就简单多了。

上面那张表就是用户第一次下单的记录,我们需要利用子查询过滤出第一次查询的记录,这里选择使用 in,这个in是两列同时满足才成立,这样就能够过滤出首次用户下单的记录了

select round(sum(order_date = customer_pref_delivery_date)*100 / count(*), 2) immediate_percentage 
from Delivery
where (customer_id, order_date) in (
    select customer_id, min(order_date)
    from delivery
    group by customer_id
);

当然还有一种写法,利用avg函数计算比率

select round(avg(order_date = customer_pref_delivery_date)*100, 2) immediate_percentage 
from Delivery
where (customer_id, order_date) in (
    select customer_id, min(order_date)
    from delivery
    group by customer_id
);

游戏玩法分析IV

🔒题目

题目来源:550.游戏玩法分析IV

image-20231009115808409

🔑题解

  • 考察知识点子查询minroundavggroup by左连接datediff

    • datediff(date_1, date_2):计算 date_1 - date_2 的插值

    其它的知识点在之前的文章中都有详细讲过,这里就不再过多赘述了

1)审题,我们是要计算第一天登录之后第二天也登陆的人数占总人数的比例,所以我们首先要确定第一天登录的人数是多少,同时需要指导第一天登录的日期,按照下方的SQL,我们可以得到第一天登录的人数有哪些

select player_id, min(event_date) first_time
from Activity
group by player_id

当然这里也可以使用distinct,关于两者的比较可以看这篇文章:SQL去重是用DISTINCT好,还是GROUP BY好? - 知乎 (zhihu.com)

| player_id | first_time |
| --------- | ---------- |
| 1         | 2016-03-01 |
| 2         | 2017-06-25 |
| 3         | 2016-03-02 |

2)现在我们得到首次查询时间,我们只需要进行应该左连接,同时利用datediff函数来获取第一天登录用户第二天的登录情况

select *
from (
    select player_id, min(event_date) first_time
    from Activity
    group by player_id
) l 
left join Activity r 
on l.player_id = r.player_id and datediff(r.event_date, l.first_time) = 1;
| player_id | first_time | player_id | device_id | event_date | games_played |
| --------- | ---------- | --------- | --------- | ---------- | ------------ |
| 1         | 2016-03-01 | 1         | 2         | 2016-03-02 | 6            |
| 2         | 2017-06-25 | null      | null      | null       | null         |
| 3         | 2016-03-02 | null      | null      | null       | null         |

3)上面的查询我们可以通过 r.event_data 来判断第二天的登录情况,现在我们需要基于上表进行应该计算统计

select round(avg(r.event_date is not null), 2) fraction
from (
    select player_id, min(event_date) first_time
    from Activity
    group by player_id
) l 
left join Activity r 
on l.player_id = r.player_id and datediff(r.event_date, l.first_time) = 1;

当然还有一种写法,但是性能是没有上面那一种快,毕竟计算量增大了,不信的可以使用 explain 测试一下

select round(sum(if(r.event_date is not null, 1, 0)) / count(*), 2) fraction
from (
    select player_id, min(event_date) first_time
    from Activity
    group by player_id
) l 
left join Activity r 
on l.player_id = r.player_id and datediff(r.event_date, l.first_time) = 1; 

看这这个SQL挺复杂的,是否还有一种更简洁的写法呢?比如说不使用子查询?

这里提供一种扣友的答案:


每位教师所教授的科目种类的数量

🔒题目

题目来源:2356.每位教师所教授的科目种类的数量

image-20231009115847202

🔑题解

  • 考察知识点group bycountdistinct
select teacher_id, count(distinct subject_id) cnt
from Teacher
group by teacher_id;

查询近30天活跃用户数

🔒题目

题目来源:1141.查询近30天活跃用户数

image-20231009115951804

🔑题解

  • 考察知识点countdistinctdatediffgroup by
select activity_date day, count(distinct user_id) active_users
from Activity
where datediff('2019-07-27', activity_date) >= 0 and datediff('2019-07-27', activity_date) < 30
group by activity_date;

当然还可以这样写:

select activity_date day, count(distinct user_id) active_users
from Activity
where date_add(activity_date, interval 29 day)>='2019-07-27' and activity_date<='2019-07-27'
group by activity_date;

还可以这样写(这种写法性能更高):

select activity_date day, count(distinct user_id) active_users
from Activity
where activity_date between '2019-06-28' and '2019-07-27'
group by activity_date;

销售分析III

🔒题目

题目来源:1084.销售分析III

image-20231009120041096

🔑题解

  • 考察知识点between andleft joinminmax

1)要实现效果,需要先使用左连接

select s.product_id, p.product_name
from Product p left join Sales s on p.product_id = s.product_id
where sale_date between '2019-01-01' and '2019-03-31';
| product_id | product_name |
| ---------- | ------------ |
| 1          | S8           |
| 2          | G4           |

2)可以看到,上表中多出了product_id为2的一列,这是因为我们还没有确保当前产品是否全部在时间段内,所以还需要进行一个过滤。

我的想法是直接利用子查询查询出所有满足的product_id,然后利用 in 进行一个过滤

select product_id
from Sales
group by product_id
having min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31';

执行报如下错误,这是因为MySQL中where条件中不能使用聚合函数,这和MySQL的解析执行过程有关

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31';
# SELE' at line 15

image-20231010000305325

进行修改,将聚合函数放到 having 中(只要聚合函数在④也就是select执行条件后面,都是可以的)

select product_id
from Sales
group by product_id
having min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31';
| product_id |
| ---------- |
| 1          |

最终的结果

select s.product_id , p.product_name
from Sales s left join Product p on s.product_id = p.product_id
group by s.product_id
having min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe发布Firefly 2,提升图像质量和用户体验

&#x1f989; AI新闻 &#x1f680; Adobe发布Firefly 2&#xff0c;提升图像质量和用户体验 摘要&#xff1a;Adobe升级了其AIGC生图平台Firefly为Firefly 2&#xff0c;该版本通过引入矢量图生成功能、提升图像质量和增加多项新功能&#xff0c;大幅改善了用户体验。Firef…

用3-8译码器实现全减器

描述 请使用3-8译码器和必要的逻辑门实现全减器&#xff0c;全减器接口图如下&#xff0c;A是被减数&#xff0c;B是减数&#xff0c;Ci是来自低位的借位&#xff0c;D是差&#xff0c;Co是向高位的借位。 3-8译码器代码如下&#xff0c;可将参考代码添加并例化到本题答案中。 …

Spring 1.依赖 2.xml 3.对象 4.测试

配置模型 依赖注入 很简单 框架很简单 依赖 xml 对象 测试 依赖 写在pom mvn网址找spring 2.写类 就是对象 测试 我们获取对象&#xff08;spring创建&#xff09; 才能用 配置文件 官网找 下拉 粘贴标红 点击它告诉系统是一个 然后第二次就点加入不是新创建

虹科干货 | 虹科带你了解车载以太网-SOME/IP协议

在标准的网络七层架构中&#xff0c;SOME/IP&#xff08;Scalable service-Oriented Middleware over IP) 作为应用层协议运行于车载以太网四层以上&#xff0c;作为以太网通信中间件来实现应用层和IP层的数据交互&#xff0c;使其不依赖于操作系统&#xff0c;又能兼容AUTOSAR…

如何通过Express和React处理SSE

本文作者为360奇舞团前端开发工程师 最近AIGC技术的大热&#xff0c;市面上也出现了许多类似生产的AI工具&#xff0c;其中有一大特色就是对话的输出结果是类似真人的打字效果出现&#xff0c;要呈现出这种效果&#xff0c;最主要的就是要利用SSE技术&#xff08;Server-Sent E…

【新书推荐】AI时代,当程序员遇到ChatGPT,开发效率飞起来!

文章目录 ChatGPT为开发提速一、ChatGPT自动生成代码二、优化代码结构三、自动化测试四、智能推荐五、ChatGPT在开发中的实际应用六、总结 新书推荐《AI时代程序员开发之道&#xff1a;ChatGPT让程序员插上翅膀》内容简介作家简介目录获取方式 ChatGPT为开发提速 人工智能是当…

STM32物联网基于ZigBee智能家居控制系统

实践制作DIY- GC0169-ZigBee智能家居 一、功能说明&#xff1a; 基于STM32单片机设计-ZigBee智能家居 二、功能介绍&#xff1a; 1个主机显示板&#xff1a;STM32F103C最小系统ZigBee无线模块OLED显示器 语音识别模块多个按键ESP8266-WIFI模块&#xff08;仅WIFI版本有&…

c++数据处理----图像修补:cv::inpaint()

图像修补:cv::inpaint() cv::inpaint() 是OpenCV中的一个函数&#xff0c;用于图像修补&#xff08;image inpainting&#xff09;。图像修补是一种图像处理技术&#xff0c;用于去除图像中的损坏或不需要的区域&#xff0c;然后用周围的信息填充这些区域&#xff0c;使图像看…

苹果安卓网页的H5封装成App的应用和原生开发的应用有什么不一样?

老哥在么&#xff1f;H5封装的app和原生开发的app有什么不一样&#xff1f;&#xff0c;不懂就要问&#xff0c;我能理解哈&#xff0c;虽然这个问题有点小白&#xff0c;但是我还是得认真回答&#xff0c;以防止我回答的不是很好&#xff0c;所以我科技了一下&#xff0c;所以…

1688商品评论数据接口,1688商品评论API接口

1688商品评论内容数据接口步骤如下&#xff1a; 通过1688开放平台接口获取商品评论内容数据&#xff1a;首先&#xff0c;您需要在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。使用获取到的App Key和App Secret&#xff0c;进行…

智能防眩目前照灯系统控制器ADB

经纬恒润的自适应远光系统—— ADB&#xff08;Adaptive Driving Beam&#xff09; 是一种能够根据路况自适应变换远光光型的智能远光控制系统。根据本车行驶状态、环境状态以及道路车辆状态&#xff0c;ADB 系统自动为驾驶员开启或退出远光。同时&#xff0c;根据车辆前方视野…

深入了解进程:计算机中的任务管理与隔离

什么是进程&#xff1f; 进程是一个独立的执行环境&#xff0c;包括自己的内存空间、程序计数器、文件句柄等。每个进程都是操作系统的一个独立实例&#xff0c;它们之间通常相互隔离。 通俗来说&#xff0c;进程就是程序的一次执行过程&#xff0c;程序是静态的&#xff0c;它…

4Spring及Spring系列-基本

8、Spring/Spring MVC Spring常见面试题55道&#xff08;附答案2023最新版&#xff09;_spring面试题-CSDN博客Spring是一个开源的Java企业级开发框架&#xff0c;由Rod Johnson于2003年创建。它提供了一套全面的编程和配置模型&#xff0c;用于构建现代化的基于Java的企业应用…

【网工日常】Web网管及注意事项

通过Web网管登录设备简介 定义 Web网管是一种对设备的管理方式&#xff0c;它利用设备内置的Web服务器&#xff0c;为用户提供图形化的操作界面。用户需要从终端通过HTTPS登录到设备&#xff0c;才能利用Web网管对设备进行管理和维护。 目的 用户对设备的管理方式有命令行方式…

基于自适应图卷积网络的轨道交通短时客流预测

文章信息 论文题目为《Adaptive graph convolutional network-based short-term passenger flow prediction for metro》的一篇2023年5月发表在Journal of Intelligent Transportation Systems的基于自适应图卷积网络的轨道交通短时客流预测文章。 摘要 随着城市化进程的发展和…

医疗机构又进化了,一招搞定UPS设备太爽了!

在现代社会中&#xff0c;能源供应的可靠性至关重要&#xff0c;不间断电源&#xff08;UPS&#xff09;系统是维持关键设备运行的关键组成部分。UPS监控是一种重要的技术&#xff0c;用于实时监测UPS的性能、电池状态和电力质量。 客户案例 四川某医院是一家大型医疗机构&…

应对优秀解决方案推荐

验证码是保护网站免受自动化 的重要工具&#xff0c;但同时也给实现自动化任务带来一定的困扰。本文将为您介绍如何应对验证码识别难题&#xff0c;并推荐一些优秀的解决方案&#xff0c;帮助您在实际操作中应对验证码识别问题。 1. 验证码识别难题 验证码识别是指将网站上的…

DevExpress Reporting中文教程 - 如何在macOS等系统中生成导出报表文档

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 在本文中&#xff0c;我们将讨论如何在.NET MA…

基于threejs的3d学校示例

源码下载地址在文章末尾&#xff01; 效果演示 总览 漫游模式 切换黑夜 视频播放 源码下载地址 https://download.csdn.net/download/qq_43185384/88415886

优盘无法格式化?分享简单解决方法!

“我的优盘插入了一个带病毒的电脑中&#xff0c;现在优盘也中毒了&#xff0c;想把它格式化。但是操作的时候却显示优盘无法格式化&#xff0c;这种情况应该怎么办呢&#xff1f;” 优盘&#xff0c;又称USB闪存驱动器。由于其体积小且方便携带&#xff0c;受到广大电脑用户的…