当前位置: 首页 > news >正文

【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.指定日期的产品价格

image-20231011094016622

🔑题解

  • 考察知识点

懵了,明天补上

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;

相关文章:

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

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

基于单片机的汽车智能仪表的设计

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

【Docker 内核详解】namespace 资源隔离(一):进行 namespace API 操作的 4 种方式

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

【技术研究】环境可控型原子力显微镜超高真空度精密控制解决方案

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

【Vuex+ElementUI】Vuex中取值存值以及异步加载的使用

一、导言 1、引言 Vuex是一个用于Vue.js应用程序的状态管理模式和库。它建立在Vue.js的响应式系统之上&#xff0c;提供了一种集中管理应用程序状态的方式。使用Vuex&#xff0c;您可以将应用程序的状态存储在一个单一的位置&#xff08;即“存储”&#xff09;中&#xff0c;…...

python经典百题之简单加密数据

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

登陆认证权限控制(1)——从session到token认证的变迁 session的问题分析 + CSRF攻击的认识

前言 登陆认证&#xff0c;权限控制是一个系统必不可少的部分&#xff0c;一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位&#xff0c;不然可能系统刚刚上线就会夭折。 本篇博客回溯登陆认证的变迁历史&#xff0c;阐述sess…...

单点接地、多点接地、混合接地

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

【C++初阶(一)】学习前言 命名空间与IO流

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…...

flask vue跨域问题

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

stm32(二十)IAP升级优化(双缓存,可恢复)

这次主要对STM32F103/Keil和LPC2478/IAR加了一个IAP在线升级功能&#xff0c; 主要记录一下自己的思路&#xff0c;无代码&#xff0c;实在是代码感觉没啥写的&#xff0c;都是一些网上很多流传的东西。 1、开发环境 Keilstm32f103JLINK 2、程序思路 在升级中&#xff0c;必…...

HDLbits:Exams/ece241 2013 q4

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

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

Response Status Code 301、302

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

import { ref, onMounted, reactive } from ‘vue‘

ref, onMounted, reactive 用于创建和操作响应式数据、生命周期钩子。 1.ref 用来创建一个响应式的引用&#xff08;Reactive Reference&#xff09;的函数&#xff0c;主要用于创建基本数据类型&#xff08;如数字、字符串等&#xff09;的响应式数据。 通过 ref 创建的变…...

【TB作品】基于MSP430G2553单片机的超声波测距与报警系统,原理图,PCB

功能&#xff1a; 1 超声波测距显示 2 按键设置报警上下限 3 蜂鸣器报警 原理图&#xff1a; PCB样式&#xff1a; 实物&#xff1a; 代码&#xff1a; https://github.com/xddun/blog_code_search...

npm install报错

在命令提示符窗口下载npm&#xff0c;报错如下&#xff1a; $npm install报错信息如下&#xff1a; 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实体类

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

java项目实现不停服更新的4种方案(InsCode AI 创作助手)

文章目录 1. Blue-Green 部署2. 滚动更新3. 使用负载均衡器4. 灰度发布 在软件开发和维护中&#xff0c;不停机更新是确保应用程序持续可用的关键任务之一。以下是四种常见的不停机更新策略及其示例&#xff1a; 1. Blue-Green 部署 概念&#xff1a; Blue-Green 部署是一种部…...

7.1 yolov5优化模型时,自动标注xml数据

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

OpenClaw浏览器控制:Qwen3-14b_int4_awq驱动自动化检索与信息提取

OpenClaw浏览器控制&#xff1a;Qwen3-14b_int4_awq驱动自动化检索与信息提取 1. 为什么需要浏览器自动化助手 上周我需要做一个小型竞品分析&#xff0c;任务很简单&#xff1a;找出10个同类产品的核心功能点并整理成表格。但当我手动打开浏览器逐个搜索、翻页、复制粘贴时&…...

芯片测试实战:Tessent EDT的External Flow与Internal Flow到底怎么选?

芯片测试实战&#xff1a;Tessent EDT的External Flow与Internal Flow到底怎么选&#xff1f; 在芯片设计领域&#xff0c;测试覆盖率与效率直接影响产品良率和上市时间。作为DFT&#xff08;可测试性设计&#xff09;工程师&#xff0c;我们常常面临一个关键决策&#xff1a;如…...

MicroStation效率倍增:从快捷键到三维建模的进阶实战指南

1. 快捷键系统&#xff1a;从基础到高阶的全面掌握 MicroStation的快捷键系统就像设计师手中的瑞士军刀&#xff0c;熟练使用能让工作效率提升300%以上。我刚开始接触MicroStation时&#xff0c;总是一边画图一边在菜单栏里翻找工具&#xff0c;后来发现老工程师们手指在键盘上…...

OpenClaw长期运行方案:Phi-3-mini-128k-instruct服务的稳定性保障

OpenClaw长期运行方案&#xff1a;Phi-3-mini-128k-instruct服务的稳定性保障 1. 为什么需要长期运行方案&#xff1f; 去年冬天的一个深夜&#xff0c;我被手机警报惊醒——部署在家庭服务器的OpenClaw服务崩溃了。当时正在运行的自动化周报生成任务因此中断&#xff0c;导致…...

302重定向实战:如何用Nginx配置临时跳转避免SEO降权

302重定向实战&#xff1a;如何用Nginx配置临时跳转避免SEO降权 当网站需要临时调整页面位置时&#xff0c;302重定向就像给访客一张写着"请移步隔壁会议室"的临时指引牌。与永久搬迁通知&#xff08;301重定向&#xff09;不同&#xff0c;它明确告知搜索引擎这只是…...

程序员副业全攻略:从技术到变现

CSDN程序员副业图谱技术文章大纲副业方向概览分析程序员常见的副业类型&#xff0c;包括技术咨询、外包开发、在线教育、自媒体运营、开源项目、技术写作等。技术咨询与外包开发探讨如何通过Freelancer平台&#xff08;如Upwork、Fiverr&#xff09;或国内外包平台&#xff08;…...

Linux内核模块加载机制深度解析

1. Linux内核模块加载机制深度解析在Linux系统开发中&#xff0c;内核模块的动态加载机制为开发者提供了极大的灵活性。作为一名长期从事内核开发的工程师&#xff0c;我经常需要深入理解模块加载的完整流程&#xff0c;这对调试复杂驱动问题和性能优化至关重要。本文将以linux…...

LwEVT:嵌入式轻量级事件管理器设计与实践

1. LwEVT&#xff1a;嵌入式系统轻量级事件管理器深度解析 在资源受限的嵌入式系统中&#xff0c;事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;是构建高响应性、低耦合、可维护固件的核心范式。然而&#xff0c;传统RTOS内置的事件组&#xff08;如Fre…...

动画花园多设备数据同步终极指南:如何实现跨平台追番体验一致

动画花园多设备数据同步终极指南&#xff1a;如何实现跨平台追番体验一致 【免费下载链接】animation-garden 集找番、追番、看番的一站式弹幕追番平台&#xff0c;云收藏同步 (Bangumi)&#xff0c;离线缓存&#xff0c;BitTorrent&#xff0c;弹幕云过滤。100% Kotlin/Compos…...

Naivechain性能基准测试终极指南:评估区块链吞吐量的完整教程

Naivechain性能基准测试终极指南&#xff1a;评估区块链吞吐量的完整教程 【免费下载链接】naivechain A blockchain implementation in 200 lines of code 项目地址: https://gitcode.com/gh_mirrors/na/naivechain 想要了解区块链的真实性能表现吗&#xff1f;Naivech…...