【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.员工的直属部门
🔑题解
- 考察知识点:
union
union
:将两个结果集合并成一个结果集,回对合并后的结果集进行去重
分析:首先我们需要明确我们最终想要得到的结果是什么?
- 定位最终问题:最终得到的结果是员工 ID 及其直属部门 ID
- 对最终的问题进行分解:我们可以明确,员工可以分为两类,一类是属于多个部门的,但是有一个部门被标记为直属部门;另一类员工属于一个部门,并且没有标记为直属部门
- 逐个击破子问题,然后将结果合并即可
解题的主要思想:先明确最终的结果,将最终的结果这个大问题分解为多个子问题,然后对子问题进行逐个击破,这种方法在编程中很常见,就是所谓的分治思想
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
知识拓展
union
和 union all
的区别
- union会对数据进行去重,union all 不会对数据进行去重
- union all 比 union 要快
本题不能使用 union all 的原因是,单个部门的 primary_flag 可以为 Y,这种情况会存在重复记录,所以需要使用 union 进行去重
判断三角形
🔒题目
题目来源:610.判断三角形
🔑题解
- 考察知识点:
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.连续出现的数字
🔑题解
- 考察知识点:
自连接
分析:最直接的方式,就是进行一个自我判断,判断是否存在三个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才能够使用
- 通过 row_number 窗口函数,对每一行的行号进行一个排序,然后对 num 进行一个排序
- 我们可以知道如果数是连续的,那么 行号的序号 和 num的序号 差值是恒定的
- 利用差值恒定的性质,我们可以进行
对于窗口函数不太了解的推荐阅读这篇文章:一文带你快速了解上手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.指定日期的产品价格
🔑题解
- 考察知识点:
懵了,明天补上
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.最后一个进入巴士的人
🔑题解
- 考察知识点:
窗口函数
、limit
、order 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;
相关文章:

【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题
文章目录 【LeetCode高频SQL50题-基础版】打卡第6天:第31~35题⛅前言员工的直属部门🔒题目🔑题解 判断三角形🔒题目🔑题解 连续出现的数字🔒题目🔑题解 指定日期的产品价格🔒题目&am…...

基于单片机的汽车智能仪表的设计
基于单片机的汽车智能仪表的设计 摘要:汽车的汽车系统。速度测量以及调速是我们这次的设计所要研究的对象,本次设计的基础核心的模块就是单片机,其应用的核心的控制单元就是stc89c52单片机,用到的测速模块是霍尔传感器,…...

【Docker 内核详解】namespace 资源隔离(一):进行 namespace API 操作的 4 种方式
namespace 资源隔离(一):进行 namespace API 操作的 4 种方式 1.通过 clone() 在创建新进程的同时创建 namespace2.查看 /proc/[pid]/ns 文件3.通过 setns() 加入一个已经存在的 namespace4.通过 unshare() 在原先进程上进行 namespace 隔离5…...

【技术研究】环境可控型原子力显微镜超高真空度精密控制解决方案
摘要:针对原子力显微镜对真空度和气氛环境精密控制要求,本文提出了精密控制解决方案。解决方案基于闭环动态平衡法,在低真空控制时采用恒定进气流量并调节排气流量的方法,在高真空和超高真空控制时则采用恒定排气流量并调节进气流…...

【Vuex+ElementUI】Vuex中取值存值以及异步加载的使用
一、导言 1、引言 Vuex是一个用于Vue.js应用程序的状态管理模式和库。它建立在Vue.js的响应式系统之上,提供了一种集中管理应用程序状态的方式。使用Vuex,您可以将应用程序的状态存储在一个单一的位置(即“存储”)中,…...

python经典百题之简单加密数据
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换 程序分析 对于…...

登陆认证权限控制(1)——从session到token认证的变迁 session的问题分析 + CSRF攻击的认识
前言 登陆认证,权限控制是一个系统必不可少的部分,一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位,不然可能系统刚刚上线就会夭折。 本篇博客回溯登陆认证的变迁历史,阐述sess…...

单点接地、多点接地、混合接地
有三种基本的信号接地方式:浮地、单点接地、多点接地。 浮地:目的是使电路或设备与公共地线可能引起环流的公共导线隔离起来,浮地还使不同电位的电路之间配合变得容易。缺点:容易出现静电积累引起强烈的静电放电。折中方案:接入泄…...

【C++初阶(一)】学习前言 命名空间与IO流
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...

flask vue跨域问题
问题: 调试时候跨域访问报: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 解决办法: 安装flask_cros from flask_cors import CORS CORS(app) app.after_request def a…...

stm32(二十)IAP升级优化(双缓存,可恢复)
这次主要对STM32F103/Keil和LPC2478/IAR加了一个IAP在线升级功能, 主要记录一下自己的思路,无代码,实在是代码感觉没啥写的,都是一些网上很多流传的东西。 1、开发环境 Keilstm32f103JLINK 2、程序思路 在升级中,必…...

HDLbits:Exams/ece241 2013 q4
本题是一个实际的应用问题,一个水库,有三个传感器S1、S2、S3提供输入,经过控制电路,四个输出给到四个流量阀。也就是说,本题想让我们根据水位去控制流量阀。 问题的关键在于把什么抽象成state,答案是&…...

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

Response Status Code 301、302
目录 Information Django redirect Influence Information HTTP状态码301、302和304分别表示以下情况: codeinformation301(Moved Permanently) 永久重定向。当请求的资源已经被永久地移动到了一个新的URI时,服务器会返回这个…...

import { ref, onMounted, reactive } from ‘vue‘
ref, onMounted, reactive 用于创建和操作响应式数据、生命周期钩子。 1.ref 用来创建一个响应式的引用(Reactive Reference)的函数,主要用于创建基本数据类型(如数字、字符串等)的响应式数据。 通过 ref 创建的变…...

【TB作品】基于MSP430G2553单片机的超声波测距与报警系统,原理图,PCB
功能: 1 超声波测距显示 2 按键设置报警上下限 3 蜂鸣器报警 原理图: PCB样式: 实物: 代码: https://github.com/xddun/blog_code_search...

npm install报错
在命令提示符窗口下载npm,报错如下: $npm install报错信息如下: npm WARN old lockfile npm WARN old lockfile The package-lock.json file was created with an old version of npm, npm WARN old lockfile so supplemental metadata must…...

Flutter自定义model实体类
在某些场景下,我们可能需要自定义Flutter model实体类,来创建更加结构化和有组织的代码,提高代码的可重用性,并增强Flutter应用程序的整体可维护性。 自定义小部件:在创建自己的小部件时,可能需要定义自定义数据类型来…...

java项目实现不停服更新的4种方案(InsCode AI 创作助手)
文章目录 1. Blue-Green 部署2. 滚动更新3. 使用负载均衡器4. 灰度发布 在软件开发和维护中,不停机更新是确保应用程序持续可用的关键任务之一。以下是四种常见的不停机更新策略及其示例: 1. Blue-Green 部署 概念: Blue-Green 部署是一种部…...

7.1 yolov5优化模型时,自动标注xml数据
yolov5优化模型时,一般需要继续标注一些检测错误的图片,将其标为xml数据。以下是根据训练好的模型自动标注xml数据的python代码: 注意:代码中包含了本人的yolov5的测试过程,测试过程可以自己根据yolov5的测试文件自行…...

开发者职场“生存状态”大调研报告分析 - 第一版
听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…...

在MySQL中使用!=还能走索引吗?
在MySQL中使用!还能走索引吗? 一般情况下,我们会在一个索引上较多的使用等值查询或者范围查询,此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询,索引还能发挥他的作用吗…...

【算法题】2897. 对数组执行操作使平方和最大
题目: 给你一个下标从 0 开始的整数数组 nums 和一个 正 整数 k 。 你可以对数组执行以下操作 任意次 : 选择两个互不相同的下标 i 和 j ,同时 将 nums[i] 更新为 (nums[i] AND nums[j]) 且将 nums[j] 更新为 (nums[i] OR nums[j]) &#…...

2023年中国划船机产量、销量及市场规模分析[图]
划船机是一种健身器材,它模拟了划船的运动,可以锻炼身体的肌肉力量和协调性。划船机通常由座椅、把手、脚踏板和传动装置组成,使用者可以通过拉动把手来模拟划船的动作,从而达到锻炼身体的目的。 划船机产业链 资料来源ÿ…...

Kafka和RabbitMQ的对比
Rabbitmq比kafka可靠,kafka更适合IO高吞吐的处理,比如ELK日志收集 Kafka和RabbitMq一样是通用意图消息代理,他们都是以分布式部署为目的。但是他们对消息语义模型的定义的假设是非常不同的。 a) 以下场景比较适合使用Kafka。如果有大量的事…...

ffmpeg从一个视频中提取音频
ffmpeg -i ~/video/video.mp4 -vn -acodec copy ~/video/audioFile.m4a 从video.mp4中提取音频到文件audioFile.m4a中 查看提取的音频文件 ffprobe ~/video/audioFile.m4a...

CCF CSP题解:坐标变换(其一)(202309-1)
链接 OJ链接:传送门 AC代码 #include <iostream>using namespace std;int n, m;int dx 0, dy 0;int main() {cin >> n >> m;for (int i 0; i < n; i) {int x, y;cin >> x >> y;dx x;dy y;}for (int i 0; i < m; i) {i…...

跳表C语言
【C语言】算法学习跳表_c语言跳表-CSDN博客 leetcode原题,代码如下 #define MAX(a, b) ((a) > (b) ? (a) : (b)) const int MAX_LEVEL 32; const int P_FACTOR RAND_MAX >> 2;typedef struct SkiplistNode {int val;int maxLevel;struct SkiplistNode…...

【JavaEE】_tomcat的安装与简单使用
目录 1. 安装tomcat 1.1 下载tomcat并解压缩 1.2 启动tomcat 1.3 访问tomcat欢迎页面 2. tomcat简单使用:部署前端代码 3. 基于tomcat的网站后端开发 tomcat是一个HTTP服务器,HTTP协议就是HTTP客户端与HTTP服务器之间通信使用的协议。 其中HTTP客…...

React 状态管理 - Context API 前世今生(上)旧版v16.3前
目录 扩展学习资料 Context api before React v16.3 Context 实战使用-Context Context VS Props Context Props Context的缺陷 New Context API 的实践 扩展学习资料 名称 链接 备注 new context api https://reactjs.org/docs/context.html 英文 old context …...