【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题

文章目录

  • 【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题
    • ⛅前言
    • 员工的直属部门
      • 🔒题目
      • 🔑题解
    • 判断三角形
      • 🔒题目
      • 🔑题解
    • 连续出现的数字
      • 🔒题目
      • 🔑题解
    • 指定日期的产品价格
      • 🔒题目
      • 🔑题解
    • 最后一个进入巴士的人
      • 🔒题目
      • 🔑题解

【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题

⛅前言

  在这个博客专栏中,我将为大家提供关于 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)全球极客挚爱的技术成长平台

员工的直属部门

🔒题目

题目来源:1789.员工的直属部门

image-20231011093751553

🔑题解

  • 考察知识点union
    • union:将两个结果集合并成一个结果集,回对合并后的结果集进行去重

分析:首先我们需要明确我们最终想要得到的结果是什么?

  1. 定位最终问题:最终得到的结果是员工 ID 及其直属部门 ID
  2. 对最终的问题进行分解:我们可以明确,员工可以分为两类,一类是属于多个部门的,但是有一个部门被标记为直属部门;另一类员工属于一个部门,并且没有标记为直属部门
  3. 逐个击破子问题,然后将结果合并即可

解题的主要思想:先明确最终的结果,将最终的结果这个大问题分解为多个子问题,然后对子问题进行逐个击破,这种方法在编程中很常见,就是所谓的分治思想

1)对于属于多个部门的员工

select employee_id , department_id 
from Employee
where primary_flag = 'Y';
| employee_id | department_id |
| ----------- | ------------- |
| 2           | 1             |
| 4           | 3             |

2)对于属于一个部门的员工

select employee_id , department_id 
from Employee 
group by employee_id
having count(*) = 1;

温馨提示:这里可以使用 count(primary_flag) 作为过滤条件,但是 count(字段) 的性能比 count(*) 的性能要低

| employee_id | department_id |
| ----------- | ------------- |
| 1           | 1             |
| 3           | 3             |

3)将上面两个子问题的结果集使用 union 进行合并

select employee_id , department_id 
from Employee
where primary_flag = 'Y';
union 
select employee_id , department_id 
from Employee 
group by employee_id
having count(*) = 1

知识拓展

unionunion all的区别

  • union会对数据进行去重,union all 不会对数据进行去重
  • union all 比 union 要快

本题不能使用 union all 的原因是,单个部门的 primary_flag 可以为 Y,这种情况会存在重复记录,所以需要使用 union 进行去重

判断三角形

🔒题目

题目来源:610.判断三角形

image-20231011102448044

🔑题解

  • 考察知识点case when
    • case when类似于 Java中的switch语句

分析:这一题的难点在于,如果我们按照以往的惯性思维,三角形的判断”两边之和大于第三边,两边只差小于第三边“,这样来实现三角形的判断是很复杂的,我们这里采用另一种判断方法,任意两边之和大于第三边来判断是否是一个三角形,这样实现起来就简单多了

select *,casewhen x + y > z and x + z > y and y + z > x then 'Yes'else 'No'end 'triangle'
from triangle;

也可以使用 if 去做

select *, if(x + y > z and x + z > y and y + z > x, 'Yes', 'No') triangle 
from Triangle

温馨提示:按照SQL编写规范,尽量少用 select * 这样的查询,这里我就偷一个小懒

连续出现的数字

🔒题目

题目来源:180.连续出现的数字

image-20231011093954336

🔑题解

  • 考察知识点自连接

分析:最直接的方式,就是进行一个自我判断,判断是否存在三个id是连续的。那么如何判断三个id是否连续呢?

由于连续的id插值是1,我们只需要判断三个间隔为1的id,他们的num值是否相等即可,下面是SQL

select distinct l1.num ConsecutiveNums
from Logs l1, Logs l2, Logs l3
where l1.id = l2.id - 1 and l2.id = l3.id - 1 and l1.num = l2.num and l2.num = l3.num;

此外,这里还提供一种更先进的解法:

分析:通过窗口函数 row_number 实现,该窗口函数会按照指定的列值按照大小进行排名。利用这个性质即可巧妙的实现判断是否存在一个数连续出现3次,甚至更加灵活,可以判断一个数出现 n 次,这比前面那种方法更加优秀,但是必须是MySQL8才能够使用

  1. 通过 row_number 窗口函数,对每一行的行号进行一个排序,然后对 num 进行一个排序
  2. 我们可以知道如果数是连续的,那么 行号的序号 和 num的序号 差值是恒定的
  3. 利用差值恒定的性质,我们可以进行

对于窗口函数不太了解的推荐阅读这篇文章:一文带你快速了解上手MySQL8新增的窗口函数

1)通过窗口函数查出每一行的行号,还有 num 的排名

select id,num,row_number() over() row_num,row_number() over(partition by num order by id) num_rank
from Logs; 
| id | num | row_num | num_rank |
| -- | --- | ------- | -------- |
| 1  | 1   | 1       | 1        |
| 2  | 1   | 2       | 2        |
| 3  | 1   | 3       | 3        |
| 5  | 1   | 5       | 4        |
| 4  | 2   | 4       | 1        |
| 6  | 2   | 6       | 2        |
| 7  | 2   | 7       | 3        |

2)我们需要将 所有相同 num 同时满足 差值相等 的列全都采用 group by 进行聚合

elect l.num ConsecutiveNums, l.row_num
from (select id,num,row_number() over() row_num,row_number() over(partition by num order by id) num_rankfrom Logs
) l
group by l.num, (l.row_num - l.num_rank);
| ConsecutiveNums | row_num |
| --------------- | ------- |
| 1               | 1       |
| 1               | 5       |
| 2               | 4       |
| 2               | 6       |

3)上面由于 group by 并不能将所有 num 相同的,因为group by 会进行两次分组,先按照 num 进行分组,还需要进行一个去重

elect distinct l.num ConsecutiveNums
from (select id,num,row_number() over() row_num,row_number() over(partition by num order by id) num_rankfrom Logs
) l
group by l.num, (l.row_num - l.num_rank);
| ConsecutiveNums |
| --------------- |
| 1               |
| 2               |

4)然后过滤分组中记录数量超过3的记录即可

select distinct l.num ConsecutiveNums
from (select id,num,row_number() over() row_num,row_number() over(partition by num order by id) num_rankfrom Logs
) l
group by l.num, (l.row_num - l.num_rank)
having count(*) >= 3

此时这个SQL就很通用了,可以查询出任意连续出现次数的 num

指定日期的产品价格

🔒题目

题目来源:1164.指定日期的产品价格

在这里插入图片描述

🔑题解

  • 考察知识点子查询max左连接group by

分析:我们需要明确我们的最终目标,是查询出所有日期在 ‘2019-08-16’ 时的产品的价格,这里有是非重要的关键点:

  1. 产品在当天(2019-08-16) 存在变动价格,那么价格就是当天的
  2. 产品在没有在当天进行价格变动,但是当天之前存在价格变动,那么价格是距离当天最近的价格
  3. 产品没有在当天进行价格变动,也没有在当天之前进行价格变动,但是在当天之后存在价格变动,那么价格直接是10,因为每次价格的变动都是在之前的基础上增加10

综合以上三点,我们可以将产品分为两大类

  1. 一大类是产品价格变动时间 <= 2019-08-16,这类产品的价格将会是最大时间处的价格
  2. 一大类就是产品价格变动时间 > 2019-08-16,这类产品的价格直接是10

PS:这个题考察的知识点比较多,也比较综合,刚开始写都没啥头绪┭┮﹏┭┮,现在复写了两遍,渐渐有感觉了,下次遇到这类型的题目应该是会有思路的,可以说刷题获得的不仅有知识,还有经验

1)查询出第一大类的产品

select product_id, max(change_date)
from products
where change_date <= '2019-08-16'
group by product_id;
| product_id | max(change_date) |
| ---------- | ---------------- |
| 1          | 2019-08-16       |
| 2          | 2019-08-14       |

2)通过产品的 id 和 变动时间筛选出第一大类产品的价格

select product_id, new_price 
from products
where (product_id, change_date) in (select product_id, max(change_date)from productswhere change_date <= '2019-08-16'group by product_id
);
| product_id | new_price |
| ---------- | --------- |
| 2          | 50        |
| 1          | 35        |

3)查询出所有产品的id,我们通过这个这个id与2)的结果进行左连接,这样就能够直接筛选出第二大类的产品了

PS:所有的产品分为两大类,通过

select distinct product_id
from products;
| product_id |
| ---------- |
| 1          |
| 2          |
| 3          |

4)将1)和3)的查询的临时表进行左连接

select *
from (select distinct product_idfrom products
) as p1
left join (select product_id, new_price from productswhere (product_id, change_date) in (select product_id, max(change_date)from productswhere change_date <= '2019-08-16'group by product_id)
) as p2
on p1.product_id = p2.product_id;
| product_id | product_id | new_price |
| ---------- | ---------- | --------- |
| 1          | 1          | 35        |
| 2          | 2          | 50        |
| 3          | null       | null      |
select p1.product_id, ifnull(p2.new_price, 10) as price
from (select distinct product_idfrom products
) as p1
left join (select product_id, new_price from productswhere (product_id, change_date) in (select product_id, max(change_date)from productswhere change_date <= '2019-08-16'group by product_id)
) as p2
on p1.product_id = p2.product_id

最后一个进入巴士的人

🔒题目

题目来源:1204.最后一个进入巴士的人

image-20231011094056131

🔑题解

  • 考察知识点窗口函数limitorder by

我的思路是采用窗口函数

1)使用窗口函数新增一列

select *, sum(weight) over(order by turn) sum
from queue;
| person_id | person_name | weight | turn | sum  |
| --------- | ----------- | ------ | ---- | ---- |
| 5         | Alice       | 250    | 1    | 250  |
| 3         | Alex        | 350    | 2    | 600  |
| 6         | John Cena   | 400    | 3    | 1000 |
| 2         | Marie       | 200    | 4    | 1200 |
| 4         | Bob         | 175    | 5    | 1375 |
| 1         | Winston     | 500    | 6    | 1875 |

2)对窗口函数生成的表进行操作,即可

select person_name
from (select *, sum(weight) over(order by turn) sumfrom queue
) q
where sum <= 1000
order by sum desc
limit 1;

上面那种方法只适用于MySQL8或MySQL8以后的版本,因为窗口函数是MySQL8新增的,这里再提供一种MySQL5可以使用的版本,主要是利用用户变量来作实现weight的累加

1)

select person_name, @pre := @pre + weight sum
from Queue, (select @pre := 0) tmp
order by turn

备注:这里的(select @pre := 0) tmp主要用于初始化用户变量

| person_name | sum  |
| ----------- | ---- |
| Alice       | 250  |
| Alex        | 600  |
| John Cena   | 1000 |
| Marie       | 1200 |
| Bob         | 1375 |
| Winston     | 1875 |

2)

select q.person_name
from (select person_name, @pre := @pre + weight sumfrom Queue, (select @pre := 0) tmporder by turn
) q
where q.sum <= 1000
order by q.sum desc
limit 1;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让ChatGPT等模型学会自主思考!开创性技术“自主认知”框架

ChatGPT、百度文心一言、Bard等大语言模型展现出了超强的创造能力&#xff0c;加速了生成式AI的应用进程。但AI模型只能基于训练数据执行各种任务&#xff0c;无法像人类一样利用生活知识、过往经验用于复杂的推理和决策。 例如&#xff0c;在玩游戏时&#xff0c;人类可以利用…

01Maven的工作机制: Maven作为依赖管理工具以及Maven作为构建管理工具

Maven的特点及其应用 Maven是Apache软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具 Maven作为依赖管理工具 管理jar包的规模: 随着我们使用的框架数量越来越多以及框架的封装程度也越来越高&#xff0c;项目中使用的jar包也就越来越多 Maven工程中依…

Qt QMovie和QLabel配合播放GIF表情包

文章目录 效果演示main函数创建MoviePlayer对象头文件movieplayer.h源文件movieplayer.cpp代码解释在Qt框架中,QMovie是用于处理动画和视频的类。所有源码已在本篇文章公布。 效果演示 main函数创建MoviePlayer对象 #include <QApplication>#include "movie

至强服务器BIOS/UEFI驱动开发笔记

至强服务器BIOS/UEFI驱动开发笔记 驱动开发基础Hello UEFI Driver 项目选择项目位置初始化驱动代码文件结构驱动程序入口和基本功能导入AMI工程AMI平台Hello UEFI Driver 编译问题测试结果打印设备列表继续开发`HelloWorldSupported`函数依赖配置使用脚本编译编译测试此DXE驱动…

RCNN系列网络的理解

R-CNN 作者 &#xff1a; Ross Girshick FAST R-CNN 作者 &#xff1a; Ross Girshick FASTER R-CNN 作者 &#xff1a; Jian Sun MASK R-CNN 作者 &#xff1a;kaiming he 一…

kong 和konga网关部署及使用

Kong是一款基于OpenResty&#xff08;Nginx Lua模块&#xff09;编写的高可用、易扩展的&#xff0c;由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的&#xff0c;能提供易于使用的RESTful API来操作和配置API管理系统&#xff0c;…

使用XLua在Unity中获取lua全局变量和函数

1、Lua脚本 入口脚本 print("OK") --也会执行重定向 require("Test") 测试脚本 print("TestScript") testNum 1 testBool true testFloat 1.2 testStr "123"function testFun()print("无参无返回") endfunction te…

Android Framework通信:Handler

文章目录 前言一、Handler源码分析1、创建Handler2、发送消息3、取消息4、消息处理5、线程切换的方法&#xff08;Handler异步消息处理机制流程&#xff09;handler.sendMessage()handler.post()View.post()Activity中的runOnUiThread() 二、Handler高频面试题1、为什么要有Han…

React TreeSelect设置默认展开项的方法

需要实现TreeSelect组件的onTreeExpand、treeExpandedKeys方法。 代码样例如下&#xff1a; 1.TreeSelect标签部分 render() {const {codeselect} this.props;const {treeExpandedKeys} this.state ................<TreeSelectshowSearch{false}dropdownStyle{{ maxHei…

Java架构师缓存架构设计解决方案

目录 1 缓存常见的三大问题1.1 缓存雪崩1.2 缓存穿透1.3 缓存击穿2 缓存key的生成策略3 热点数据集中失效的问题4 如何提高缓存的命中率5 缓存和数据库双写不一致的问题6 如何对缓存数据进行分片想学习架构师构建流程请跳转:Java架构师系统架构设计 1 缓存常见的三大问题 缓…

分布式事务协调中间件---seata快速入门

分布式事务 Seata&#xff0c;之前叫做Fescar&#xff0c;是一个开源的分布式事务解决方案&#xff0c;它主要致力于提供高效和简单的分布式事务服务。Seata主要用于解决微服务架构下的数据一致性问题。 Seata 的基本原理是基于两阶段提交 (2PC) 以及三阶段提交 (3PC)&#xff…

私域社群团购直播活动报名小程序开发

新零售SaaS系统&#xff0c;一款超级好用的私域社交团购小程序。支持团购、直播&#xff0c;有统计、收款、发货等功能。直播配合开团转化率更高&#xff0c;一款真正的私域卖货神器。 社交化电商用户踊跃参与&#xff1a;在卖货的同时&#xff0c;体现众多消费者的参与动态更…

C语言---预处理详解

1.预定义符号 在C语言中有一些内置的预定义符号 __FILE__ __LINE__ __DATE__ __TIME__ __STDC__//进行编译的源文件 //文件当前的行号 //文件被编译的日期 //文件被编译的时间 //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义 编译器在__STDC__报错,说明,v…

回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测(多指标,多图)

回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09;…

小程序框架语法详解以及页面生命周期的代码预演

目录 一、框架简介 二、视图层 2.1 简介 2.2 WXML语法演示 2.2.1 数据绑定 2.2.2 列表渲染 2.2.3 条件渲染 2.2.4 模板 2.3 事件系统 2.4 页面一级菜单展示及切换 2.5 a页面跳b页面界面内部按钮演示 2.6 a页面跳c页面&#xff08;不在一级菜单内的页面&#xff09;…

Webpack和JShaman相比有什么不同?

Webpack和JShaman相比有什么不同&#xff1f; Webpack的功能是打包&#xff0c;可以将多个JS文件打包成一个JS文件。 JShaman专门用于对JS代码混淆加密&#xff0c;目的是让JavaScript代码变的不可读、混淆功能逻辑、加密代码中的隐秘数据或字符&#xff0c;是用于代码保护的…

想要精通算法和SQL的成长之路 - 滑动窗口和大小根堆

想要精通算法和SQL的成长之路 - 滑动窗口和大小根堆 前言一. 大小根堆二. 数据流的中位数1.1 初始化1.2 插入操作1.3 完整代码 三. 滑动窗口中位数3.1 在第一题的基础上改造3.2 栈的remove操作 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 大小根堆 先来说下大小根堆是什…

NPM 常用命令(十二)

目录 1、npm unpublish 1.1 使用语法 1.2 描述 2、npm unstar 2.1 使用语法 3、npm update 3.1 使用语法 3.2 描述 3.3 示例 插入符号依赖 波浪号依赖 低于 1.0.0 的插入符号依赖 子依赖 更新全局安装的包 4、npm version 4.1 使用语法 5、npm view 5.1 使用语…

LLMs的终局是通用人工智能AGI总结 生成式AI和大语言模型 Generative AI LLMs

终于学完了 生成式AI和大语言模型 Generative AI & LLMs. LLMs 解决了如下问题&#xff1a; 对NLP的不能够理解长句子&#xff0c;解决方案 自注意力机制Transformers architecture Attention is all you need大模型算力不够&#xff0c;解决方案 LLMs 缩放法则和计算最…

电商爬虫API快速入门指南

​电子商务爬虫API​是一个公共数据爬虫API&#xff0c;旨在通过大多数电子商务网站收集大量实时本地化数据并搜索信息。这个数据收集工具作为一个值得信赖的解决方案&#xff0c;实现通过最复杂的电子商务网站收集公共信息。电子商务爬虫API适用于商业用例&#xff0c;诸如价格…