【力扣 | SQL题 | 每日5题】力扣2362, 2356, 2394, 2480, 2388

1. 力扣2362:生成发票

1.1 题目:

表: Products

+-------------+------+
| Column Name | Type |
+-------------+------+
| product_id  | int  |
| price       | int  |
+-------------+------+
product_id 包含唯一值。
该表中的每一行显示了一个产品的 ID 和一个单位的价格。

表: Purchases

+-------------+------+
| Column Name | Type |
+-------------+------+
| invoice_id  | int  |
| product_id  | int  |
| quantity    | int  |
+-------------+------+
(invoice_id, product_id) 是该表的主键(具有唯一值的列的组合)
该表中的每一行都显示了从发票中的一种产品订购的数量。

编写解决方案,展示价格最高的发票的详细信息。如果两个或多个发票具有相同的价格,则返回 invoice_id 最小的发票的详细信息。

以 任意顺序 返回结果表。

结果格式示例如下。

示例 1:

输入: 
Products 表:
+------------+-------+
| product_id | price |
+------------+-------+
| 1          | 100   |
| 2          | 200   |
+------------+-------+
Purchases 表:
+------------+------------+----------+
| invoice_id | product_id | quantity |
+------------+------------+----------+
| 1          | 1          | 2        |
| 3          | 2          | 1        |
| 2          | 2          | 3        |
| 2          | 1          | 4        |
| 4          | 1          | 10       |
+------------+------------+----------+
输出: 
+------------+----------+-------+
| product_id | quantity | price |
+------------+----------+-------+
| 2          | 3        | 600   |
| 1          | 4        | 400   |
+------------+----------+-------+
解释: 
发票 1: price = (2 * 100) = $200
发票 2: price = (4 * 100) + (3 * 200) = $1000
发票 3: price = (1 * 200) = $200
发票 4: price = (10 * 100) = $1000最高价格是 1000 美元,最高价格的发票是 2 和 4。我们返回 ID 最小的发票 2 的详细信息。

1.2 思路:

价格最高=>排名第一=>窗口函数=>rank=>ranks=1

1.3 题解:

-- 以invoice_id分组,查询发票的总价格
with tep1 as (select invoice_id , sum(quantity*price) pricefrom Products t1 join Purchases t2 on t1.product_id = t2.product_id group by invoice_id
), tep2 as (-- 依据价格给每个发票一个排名select invoice_id, price, rank() over (order by price desc, invoice_id) ranksfrom tep1
), tep3 as (-- 然后在Purchases表中找到最高价格发票的记录select product_id , quantity from Purchases where invoice_id = (select invoice_id from tep2 where ranks = 1)
)
-- 内连接收尾
select t1.product_id, quantity , quantity*price price 
from tep3 t1
join Products t2 
on t1.product_id = t2.product_id 

2. 力扣2356:每位教师所教授的科目种类的数量

2.1 题目:

表: Teacher

+-------------+------+
| Column Name | Type |
+-------------+------+
| teacher_id  | int  |
| subject_id  | int  |
| dept_id     | int  |
+-------------+------+
在 SQL 中,(subject_id, dept_id) 是该表的主键。
该表中的每一行都表示带有 teacher_id 的教师在系 dept_id 中教授科目 subject_id。

查询每位老师在大学里教授的科目种类的数量。

以 任意顺序 返回结果表。

查询结果格式示例如下。

示例 1:

输入: 
Teacher 表:
+------------+------------+---------+
| teacher_id | subject_id | dept_id |
+------------+------------+---------+
| 1          | 2          | 3       |
| 1          | 2          | 4       |
| 1          | 3          | 3       |
| 2          | 1          | 1       |
| 2          | 2          | 1       |
| 2          | 3          | 1       |
| 2          | 4          | 1       |
+------------+------------+---------+
输出:  
+------------+-----+
| teacher_id | cnt |
+------------+-----+
| 1          | 2   |
| 2          | 4   |
+------------+-----+
解释: 
教师 1:- 他在 3、4 系教科目 2。- 他在 3 系教科目 3。
教师 2:- 他在 1 系教科目 1。- 他在 1 系教科目 2。- 他在 1 系教科目 3。- 他在 1 系教科目 4。

2.2 思路:

简单题。

2.3 题解:

-- 先去重后查询
with tep as (select distinct teacher_id , subject_id from Teacher
)select teacher_id, count(*) cnt 
from tep
group by teacher_id

3. 力扣2394:开除员工

3.1 题目:

表: Employees

+--------------+------+
| Column Name  | Type |
+--------------+------+
| employee_id  | int  |
| needed_hours | int  |
+--------------+------+
employee_id 是该表具有的唯一值的列。
每一行都包含员工的 id 和他们获得工资所需的最低工作时数。

表: Logs

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| in_time     | datetime |
| out_time    | datetime |
+-------------+----------+
(employee_id, in_time, out_time) 是该表的主键(具有唯一值的列的组合)。
该表的每一行都显示了员工的时间戳。in_time 是员工开始工作的时间,out_time 是员工结束工作的时间。
所有时间都在 2022 年 10 月。out_time 可以是 in_time 之后的一天,这意味着该员工在午夜之后工作。

在公司里,每个员工每个月必须工作一定的小时数。员工在工作段中工作。员工工作的小时数可以通过员工在所有工作段中工作的分钟数的总和来计算。每个工作段的分钟数是向上取整的。

  • 例如,如果员工在一个时间段中工作了 51 分 2 秒,我们就认为它是 52 分钟。

编写解决方案来报告将被开除的员工的 id。换句话说,报告没有工作所需时间的员工的 id。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入: 
Employees 表:
+-------------+--------------+
| employee_id | needed_hours |
+-------------+--------------+
| 1           | 20           |
| 2           | 12           |
| 3           | 2            |
+-------------+--------------+
Logs 表:
+-------------+---------------------+---------------------+
| employee_id | in_time             | out_time            |
+-------------+---------------------+---------------------+
| 1           | 2022-10-01 09:00:00 | 2022-10-01 17:00:00 |
| 1           | 2022-10-06 09:05:04 | 2022-10-06 17:09:03 |
| 1           | 2022-10-12 23:00:00 | 2022-10-13 03:00:01 |
| 2           | 2022-10-29 12:00:00 | 2022-10-29 23:58:58 |
+-------------+---------------------+---------------------+
输出: 
+-------------+
| employee_id |
+-------------+
| 2           |
| 3           |
+-------------+
解释: 
员工 1:- 参加了三个工作段:- 在 2022-10-01, 他工作了 8 个小时。- 在 2022-10-06, 他工作了 8 小时 4 分钟。- 在 2022-10-12, 他工作了 4 小时 1 分钟。请注意,他一直工作到午夜。- 员工 1 在各个时段总共工作了 20 小时5分钟,不被开除。
员工 2:- 参加了一个工作段:- 在 2022-10-29, 他工作了 11 小时 59 分钟。- 员工 2 没有工作足够的时长,将被开除。
员工 3:- 没有任何工作段。- 员工 3 没有工作足够的时长,将被开除。

3.2 思路:

使用到了timestampdiff函数和ceil函数。

3.3 题解:

-- 使用了timestampdiff函数,第一个参数限定返回值是两个时间段之间的秒数
-- /60再使用ceil天花板函数,=>每个工作段的分钟数是向上取整的
-- 然后分组求每个时间段的和with tep as (select employee_id , sum(ceil(timestampdiff(second, in_time, out_time) / 60) / 60) sum_minfrom Logsgroup by employee_id 
)
-- 这里就是简单的判断比较
select t1.employee_id
from Employees t1 
left join tep t2 
on t1.employee_id = t2.employee_id
where sum_min is null or 
sum_min < needed_hours

4. 力扣2480:形成化学键

4.1 题目:

表: Elements

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| symbol      | varchar |
| type        | enum    |
| electrons   | int     |
+-------------+---------+
symbol 是该表的主键(具有唯一值的列)。
该表的每一行包含一个元素的信息。
type 是 ENUM 类型,它的值是 ('Metal', 'Nonmetal', 'Noble') 之一- 如果 type 是 Noble, electrons 是 0。- 如果 type 是 Metal, electrons 是这种元素的一个原子所能给出的电子数。- 如果 type 是 Nonmetal, electrons 这种元素的一个原子所需要的电子数。

如果一个元素是 'Metal',另外一个元素是 'Nonmetal' ,那么它们可以形成键。

编写一个解决方案找出所有可以形成键的元素对。

以 任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入: 
Elements 表:
+--------+----------+-----------+
| symbol | type     | electrons |
+--------+----------+-----------+
| He     | Noble    | 0         |
| Na     | Metal    | 1         |
| Ca     | Metal    | 2         |
| La     | Metal    | 3         |
| Cl     | Nonmetal | 1         |
| O      | Nonmetal | 2         |
| N      | Nonmetal | 3         |
+--------+----------+-----------+
输出: 
+-------+----------+
| metal | nonmetal |
+-------+----------+
| La    | Cl       |
| Ca    | Cl       |
| Na    | Cl       |
| La    | O        |
| Ca    | O        |
| Na    | O        |
| La    | N        |
| Ca    | N        |
| Na    | N        |
+-------+----------+
解释: 
Metal 元素包括 La, Ca, and Na.
Nonmetal 元素包括 Cl, O, and N.
每个 Metal 元素与输出表中的 Nonmeal 元素配对。

4.2 思路:

其实本质就是笛卡尔积。

看输出表即可。

4.3 题解:

with tep1 as (select symbol metal from Elements where type = 'Metal'
), tep2 as (select symbol nonmetalfrom Elements where type = 'Nonmetal'
)
select metal, nonmetal
from tep1, tep2

5. 力扣2388:将表中的空值更改为前一个值

5.1 题目:

表: CoffeeShop

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| drink       | varchar |
+-------------+---------+
id 是该表的主键(具有唯一值的列)。
该表中的每一行都显示了订单 id 和所点饮料的名称。一些饮料行为 null。

编写一个解决方案将 drink 的 null 值替换为前面最近一行不为 null 的 drink。保证表第一行的 drink 不为 null

返回 与输入顺序相同的 结果表。

查询结果格式示例如下。

示例 1:

输入: 
CoffeeShop 表:
+----+-------------------+
| id | drink             |
+----+-------------------+
| 9  | Rum and Coke      |
| 6  | null              |
| 7  | null              |
| 3  | St Germain Spritz |
| 1  | Orange Margarita  |
| 2  | null              |
+----+-------------------+
输出: 
+----+-------------------+
| id | drink             |
+----+-------------------+
| 9  | Rum and Coke      |
| 6  | Rum and Coke      |
| 7  | Rum and Coke      |
| 3  | St Germain Spritz |
| 1  | Orange Margarita  |
| 2  | Orange Margarita  |
+----+-------------------+
解释: 
对于 ID 6,之前不为空的值来自 ID 9。我们将 null 替换为 "Rum and Coke"。
对于 ID 7,之前不为空的值来自 ID 9。我们将 null 替换为 "Rum and Coke"。
对于 ID 2,之前不为空的值来自 ID 1。我们将 null 替换为 "Orange Margarita"。
请注意,输出中的行与输入中的行相同。

5.2 思路:

先给每个记录一个排名,然后对于每条记录来说,如果该记录的drink值为null(不为null的情况没啥讨论的),就自连接查询,where限制排名要低于该记录,并且drink不为null,得到最高的排名。从而得到最高排名的记录。

5.3 题解:

-- 先给原表的每行记录一个排名
with tep as (select id , drink, row_number() over () ranksfrom CoffeeShop
)
-- 然后case when决定drink值
-- 如果drink为null,则需要根据排名找到对应的记录。
-- 首先它的排名应该低于t1表的id,并且drink不为null
-- 然后最大排名的人的drink就是这个没有drink值的人的drink
select id, 
case when drink is not null then drink
else (select drink from tep t2 whereranks = (select max(ranks) from tep where ranks < t1.ranks anddrink is not null)
)
end drink
from tep t1

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

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

相关文章

springboot中service和controller作用

在 Spring Boot 应用程序中,Service 层和 Controller 层各自承担着不同的职责。了解这两者的作用有助于更好地设计和组织应用程序。下面详细介绍 Service 层和 Controller 层的作用及其区别。 Controller 层的作用 处理 HTTP 请求: Controller 层主要负责接收来自客户端的 H…

【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)

文章目录 Qt1. Qt的概念2. 使用Qt Creator新建项目3. 运行Qt项目3.1 纯代码方式实现3.2 可视化操作实现 4. 认识对象模型&#xff08;对象树&#xff09; Qt 1. Qt的概念 Qt 是一个跨平台的 C 图形用户界面应用程序开发框架。它是软件开发者提供的用于界面开发的程序框架&#…

Mysql(5)—函数

一、关于函数 1.1 简介 MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类&#xff0c;包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。 ​ ‍ 1.2 发展 早期版本&#xff08;MySQL 3.x 和 4.x&#xff09; : MySQL 最初…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

Android 原生程序使用gdb, addr2line, readelf调试

Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 一 gdb1. 原生程序添加调试符号2. 主机上adb push 编译好的原生程序到设备3. 设备上使用gdbserver运行原生程序4. 主机上设置adb端口转发5. 主机上运行gdb调试 二 addr2line三 readelf 一 gdb GDB&#xff08;GNU…

Java最全面试题->计算机基础面试题->计算机网络面试题

计算机网络 下边是我自己整理的面试题&#xff0c;基本已经很全面了&#xff0c;想要的可以私信我&#xff0c;我会不定期去更新思维导图 哪里不会点哪里 1.说一下TCP/IP四层模型 TCP/IP协议是美国国防部高级计划研究局为实现ARPANET互联网而开发的。 网络接口层&#xff…

现代物流管理:SpringBoot技术突破

3系统分析 3.1可行性分析 通过对本智能物流管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本智能物流管理系统采用SSM框架&#xff0c;JAVA作为开发语…

如何在Docker中运行Squid

测试环境 VMware Rocky Linux 9.4 实现步骤 过程&#xff1a;写一个Dockerfile构建Squid镜像; 再写一个启动脚本start_squid.sh&#xff0c;在启动脚本中配置并运行Squid。 编写Dockerfile 以rockylinux9.3做基础镜像&#xff0c;通过yum安装Squid, 拷贝squid.conf FROM …

【云从】九、CDN加速

文章目录 1、CDN基本概念2、CDN加速3、云CDN 1、CDN基本概念 源站&#xff1a;用户稳定运行的业务应用服务器 静态内容&#xff1a;用户多次访问某一资源&#xff0c;响应返回的数据都是相同的内容 例如:图片、视频、软件安装包、安卓 apk 安装包、压缩包文件等动态内容&…

c++ cpu亲缘性

CPU亲缘性&#xff08;CPU Affinity&#xff09;是指将线程或进程固定到特定的CPU核心上运行的能力。这种做法可以减少上下文切换&#xff0c;提高缓存利用率&#xff0c;从而提升性能。 原理 缓存局部性: 当线程在同一个CPU上运行时&#xff0c;它可以利用该CPU的缓存&#…

【数据结构】栈和队列经典题目

目录 1.有效的括号【链接】 代码实现 2.用队列实现栈【链接】 代码实现 3.用栈实现队列 ​编辑 代码实现 4.循环队列&#xff08;数组实现&#xff09;【链接】 代码实现 1.有效的括号【链接】 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&…

关于Flutter 中,App内购支付集成 Google 签名的管理-手动生成签名 APK

Google play 手动生成签名 APK 1. 要创建一个 JKS&#xff08;Java KeyStore&#xff09;文件&#xff0c;可以使用 keytool 命令行工具。keytool 是 JDK 自带的工具&#xff0c;用于生成和管理密钥库和证书。 步骤 1&#xff1a;安装 JDK 确保已安装 JDK。如果未安装&#…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

数据结构7——二叉树的顺序结构以及堆的实现

在上篇文章数据结构6——树与二叉树中&#xff0c;我们了解了树和二叉树的概念&#xff0c;接着上篇文章&#xff0c;在本篇文章中我们学习二叉树顺序结构的实现。 目录 1. 二叉树的顺序存储结构 2. 堆的概念及结构 1. 堆的概念 2. 堆的结构 3. 堆的实现 1. 堆节点 2. 交…

R语言实现logistic回归曲线绘制

方式一&#xff1a;编制函数 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码快 f <- function(x){y 1/(1 exp(-x))plot(x,y)}#sigmoid函数 f(x)​ 方式二&#xff1a;Sigmoid函数代码 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码块 #y<-1/(1exp(-x)) y&…

数据结构-复杂度

复杂度 1.数据结构1.1算法 2.算法效率2.1复杂度的概念 3.时间复杂度3.1大O渐进表示法3.2时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例5&#xff1a;3.2.6 示例63.2.7 示例7 4.空间复杂度4.1.1 示例14.1.2 示例2 5.常见复杂度对比6.复杂度算法题6…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束&#xff0c;守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中&#xff0c;检查约束&#xff08;CHECK&#xff09;是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

考研前所学c语言02(2024/10/16)

1.一个十进制的数转化为二进制的就是不断除二取余&#xff0c;得到的余数从下到上取 比如123&#xff1a; 结果为&#xff1a; 同理其他的十进制转八进制&#xff0c;十六进制就除八&#xff0c;除十六即可 再比如123转十六进制&#xff1a; 因为余数是11&#xff0c;十六进…

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

oracle_查询建表语句

查询建表语句 SELECTdbms_metadata.get_ddl ( TABLE, <table_name> ) FROMdualdbms_metadata.get_ddl&#xff1a;是Oracle提供的一个函数&#xff0c;用于获取数据库对象的DDL语句&#xff0c;它允许你查看或导出数据库对象的创建脚本‘TABLE’&#xff1a; 是这个函数…