【力扣 | SQL题 | 每日4题】力扣1164,3293,1308,1270

server/2024/10/21 7:47:16/

4 mid,四题都比较简单,没什么难度。

1. 力扣1164:指定日期的产品价格

1.1 题目:

产品数据表: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| new_price     | int     |
| change_date   | date    |
+---------------+---------+
(product_id, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。

编写一个解决方案,找出在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。

以 任意顺序 返回结果表。

结果格式如下例所示。

示例 1:

输入:
Products 表:
+------------+-----------+-------------+
| product_id | new_price | change_date |
+------------+-----------+-------------+
| 1          | 20        | 2019-08-14  |
| 2          | 50        | 2019-08-14  |
| 1          | 30        | 2019-08-15  |
| 1          | 35        | 2019-08-16  |
| 2          | 65        | 2019-08-17  |
| 3          | 20        | 2019-08-18  |
+------------+-----------+-------------+
输出:
+------------+-------+
| product_id | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+

1.2 思路:

看注释。

1.3 题解:

sql">with tep1 as (-- 先将2019-08-16之前的数据过滤掉select *from Productswhere change_date  <= '2019-08-16'
), tep2 as (-- 然后给product_id开窗给出排名select product_id, new_price ,rank() over (partition by product_id order by change_date desc) ranksfrom tep1
), tep3 as (-- 查询到所有的产品select distinct product_idfrom Products 
), tep4 as (-- 查询到每个产品的最新修改的价格select product_id, new_pricefrom tep2where ranks = 1
)
-- left join保证所有产品都可以查询到
select t1.product_id , ifNull(new_price, 10) price 
from tep3 t1
left join tep4 t2
on t1.product_id = t2.product_id

2. 力扣3293:计算产品最终价格

2.1 题目:

表:Products

+------------+---------+ 
| Column Name| Type    | 
+------------+---------+ 
| product_id | int     | 
| category   | varchar |
| price      | decimal |
+------------+---------+
product_id 是这张表的唯一主键。
每一行包含产品的 ID,分类以及价格。

表:Discounts

+------------+---------+ 
| Column Name| Type    | 
+------------+---------+ 
| category   | varchar |
| discount   | int     |
+------------+---------+
category 是这张表的主键。
每一行包含有一个产品分类和该分类的折扣百分比(值的范围从 0 到 100)。

编写一个解决方案来找到每个产品使用 分类折扣 后的 最终价格。如果一个产品分类 没有关联的折扣,它的价格保持 不变

返回结果表以 product_id 升序 排序。

结果格式如下所示。

 

示例:

输入:

Products 表:

<span style="color:var(--text-secondary)"><span style="background-color:#f0f0f0"><span style="color:var(--text-secondary)">+------------+-------------+-------+
| product_id | category    | price |
+------------+-------------+-------+
| 1          | Electronics | 1000  |
| 2          | Clothing    | 50    |
| 3          | Electronics | 1200  | 
| 4          | Home        | 500   |
+------------+-------------+-------+</span></span></span>

Discounts 表:

<span style="color:var(--text-secondary)"><span style="background-color:#f0f0f0"><span style="color:var(--text-secondary)">+------------+----------+
| category   | discount |
+------------+----------+
| Electronics| 10       |
| Clothing   | 20       |
+------------+----------+</span></span></span>

输出:

<span style="color:var(--text-secondary)"><span style="background-color:#f0f0f0"><span style="color:var(--text-secondary)">+------------+------------+-------------+
| product_id | final_price| category    |
+------------+------------+-------------+
| 1          | 900        | Electronics |
| 2          | 40         | Clothing    |
| 3          | 1080       | Electronics |
| 4          | 500        | Home        |
+------------+------------+-------------+</span></span></span>

解释:

  • 对于产品 1,它属于电器分类,有 10% 的折扣,所以最终价格为 1000 - (10% of 1000) = 900。
  • 对于产品 2,它属于衣物分类,有 20% 的折扣,所以最终价格为 50 - (20% of 50) = 40。
  • 对于产品 3,它属于电器分类,有 10% 的折扣,所以最终价格为 1200 - (10% of 1200) = 1080。
  • 对于产品 4,它属于家具分类,没有可用的折扣,所以最终价格仍是 500。
结果表以 product_id 升序排序。

2.2 思路:

简单的左外连接。

2.3 题解:

sql">-- 左外连接保证可以查询到所有的产品的最终价格
-- 如果产品没有相关联的折扣,则discount为null,ifNull函数就会返回price
with tep as (select product_id , ifNull(price*(100-discount)/100, price) final_price,t1.categoryfrom Products t1left join Discounts t2on t1.category = t2.category
)
select *
from tep
order by product_id

3. 力扣1308:不同性别每日分数总计

3.1 题目:

表: Scores

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| player_name   | varchar |
| gender        | varchar |
| day           | date    |
| score_points  | int     |
+---------------+---------+
(gender, day)是该表的主键(具有唯一值的列的组合)
一场比赛是在女队和男队之间举行的
该表的每一行表示一个名叫 (player_name) 性别为 (gender) 的参赛者在某一天获得了 (score_points) 的分数
如果参赛者是女性,那么 gender 列为 'F',如果参赛者是男性,那么 gender 列为 'M'

编写解决方案统计每种性别在每一天的总分。

返回按 gender 和 day 对查询结果 升序排序 的结果。

查询结果格式的示例如下。

示例 1:

输入:
Scores表:
+-------------+--------+------------+--------------+
| player_name | gender | day        | score_points |
+-------------+--------+------------+--------------+
| Aron        | F      | 2020-01-01 | 17           |
| Alice       | F      | 2020-01-07 | 23           |
| Bajrang     | M      | 2020-01-07 | 7            |
| Khali       | M      | 2019-12-25 | 11           |
| Slaman      | M      | 2019-12-30 | 13           |
| Joe         | M      | 2019-12-31 | 3            |
| Jose        | M      | 2019-12-18 | 2            |
| Priya       | F      | 2019-12-31 | 23           |
| Priyanka    | F      | 2019-12-30 | 17           |
+-------------+--------+------------+--------------+
输出:
+--------+------------+-------+
| gender | day        | total |
+--------+------------+-------+
| F      | 2019-12-30 | 17    |
| F      | 2019-12-31 | 40    |
| F      | 2020-01-01 | 57    |
| F      | 2020-01-07 | 80    |
| M      | 2019-12-18 | 2     |
| M      | 2019-12-25 | 13    |
| M      | 2019-12-30 | 26    |
| M      | 2019-12-31 | 29    |
| M      | 2020-01-07 | 36    |
+--------+------------+-------+
解释:
女性队伍:
第一天是 2019-12-30,Priyanka 获得 17 分,队伍的总分是 17 分
第二天是 2019-12-31, Priya 获得 23 分,队伍的总分是 40 分
第三天是 2020-01-01, Aron 获得 17 分,队伍的总分是 57 分
第四天是 2020-01-07, Alice 获得 23 分,队伍的总分是 80 分男性队伍:
第一天是 2019-12-18, Jose 获得 2 分,队伍的总分是 2 分
第二天是 2019-12-25, Khali 获得 11 分,队伍的总分是 13 分
第三天是 2019-12-30, Slaman 获得 13 分,队伍的总分是 26 分
第四天是 2019-12-31, Joe 获得 3 分,队伍的总分是 29 分
第五天是 2020-01-07, Bajrang 获得 7 分,队伍的总分是 36 分

3.2 思路:

使用窗口函数sum计算每天队伍总分,然后给gender优先级排序即可。

3.3 题解:

sql">with tep1 as (-- 利用窗口函数计算每天的队伍总分select gender, day, sum(score_points) over (partition by gender order by day) total from Scores
), tep2 as (-- 然后赋给gender优先级select case gender when 'F' then 1when 'M' then 2end gender, day, totalfrom tep1
), tep3 as (select *from tep2order by gender, day
)
-- 将gender改回去
select case gender when 1 then 'F'
when 2 then 'M'
end gender, day, total
from tep3

4. 力扣1270:向公司CEO汇报工作的所有人

4.1 题目:

员工表:Employees

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| employee_id   | int     |
| employee_name | varchar |
| manager_id    | int     |
+---------------+---------+
employee_id 是这个表具有唯一值的列。
这个表中每一行中,employee_id 表示职工的 ID,employee_name 表示职工的名字,manager_id 表示该职工汇报工作的直线经理。
这个公司 CEO 是 employee_id = 1 的人。

编写解决方案,找出所有直接或间接向公司 CEO 汇报工作的职工的 employee_id 。

由于公司规模较小,经理之间的间接关系 不超过 3 个经理 。

可以以 任何顺序 返回无重复项的结果。

返回结果示例如下。

示例 1:

输入:
Employees table:
+-------------+---------------+------------+
| employee_id | employee_name | manager_id |
+-------------+---------------+------------+
| 1           | Boss          | 1          |
| 3           | Alice         | 3          |
| 2           | Bob           | 1          |
| 4           | Daniel        | 2          |
| 7           | Luis          | 4          |
| 8           | Jhon          | 3          |
| 9           | Angela        | 8          |
| 77          | Robert        | 1          |
+-------------+---------------+------------+
输出:
+-------------+
| employee_id |
+-------------+
| 2           |
| 77          |
| 4           |
| 7           |
+-------------+
解释:
公司 CEO 的 employee_id 是 1.
employee_id 是 2 和 77 的职员直接汇报给公司 CEO。
employee_id 是 4 的职员间接汇报给公司 CEO 4 --> 2 --> 1 。
employee_id 是 7 的职员间接汇报给公司 CEO 7 --> 4 --> 2 --> 1 。
employee_id 是 3, 8 ,9 的职员不会直接或间接的汇报给公司 CEO。

4.2 思路:

三张表查询结果即为,直接和间接向领导汇报工作的所有人。

4.3 题解:

sql">-- 先查询到直接汇报工作的人的id
with tep1 as (select employee_idfrom Employeeswhere manager_id = 1 and employee_id <> 1
), tep2 as (-- 再查询到间接汇报工作的人的idselect employee_id from Employeeswhere manager_id in (select * from tep1)
), tep3 as (-- 再查询到间接汇报工作的人的idselect employee_id from Employeeswhere manager_id in (select * from tep2)
)
-- 然后将这三种情况union起来
select * from tep1
union all
select * from tep2
union all
select * from tep3


http://www.ppmy.cn/server/133576.html

相关文章

UE4 材质学习笔记10(程序化噪波/覆雪树干着色器/岩层着色器)

一.程序化噪波 柏林噪波是一种能生成很好的随机图案的算法&#xff0c;它是一个无限的、不重复的图案&#xff0c;可以采用这种基础图案并以多种方式对其进行修改&#xff0c; 将它缩放并进行多次组合&#xff0c;就可以创建一个分形图案。这些组合的缩放等级称为一个Octave 这…

缓存区是什么

文章目录 前言一、数据传输二、异步操作三、性能优化四、大小和管理五、应用场景总结 前言 缓存区&#xff08;Buffer&#xff09;是计算机系统中用于临时存储数据的一块内存区域。它的主要作用是提高数据处理效率&#xff0c;解决生产者和消费者之间的速度差异。以下是缓存区…

网络安全的挑战与对策:从技术防御到综合治理的全方位分析

引言 随着互联网的迅猛发展,网络安全已成为全球关注的焦点之一。网络技术的进步为社会带来了巨大的经济、文化和科技红利,但也使得信息系统面临越来越复杂的安全威胁。网络攻击的种类日益多样化、攻击技术日益成熟化,给个人、企业、政府以及关键基础设施带来了严重的安全挑…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下&#xff0c;提高生产效率、降低成本的同时&#xff0c;满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势&#xff0c;在汽车涂装领域的应用日益广泛。然而&#xff0c;随之而来的喷涂废溶剂处理问题也日益凸显。…

python函数返回值是什么

函数返回值简介 1、简单介绍print和return的区别&#xff0c;print仅仅是打印在控制台&#xff0c;而return则是将return后面的部分作为返回值&#xff1a;作为函数的输出&#xff0c;可以用变量接走&#xff0c;继续使用该返回值做其它事。 2、函数需要先定义后调用&#xf…

【Nginx系列】Nginx配置超时时间

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

STL-string+题目

STL的六大组件&#xff1a; C 库函数 - tolower() C 标准库 - <ctype.h> C 标准库 - <ctype.h> 描述 C 库函数 int tolower(int c) 把给定的字母转换为小写字母。 C 标准库-< cctype > 库函数isalnum() 功能&#xff1a;判断一个字符是否是字母或者&#x…

Redis 一些问题

关闭Linux防火墙 找到redis 配置文件 注释 #bind 127.0.0.1 修改 protected-mode yes 改为no 如果报&#xff1a;NOAUTH Authentication required错误就是设置了密码 auth 你的密码 配置Redis spring.redis.host192.168.44.132 spring.redis.port6379 spring.redis.d…