【SQL】力扣1445. 苹果和桔子

1445. 苹果和桔子

【SQL】力扣1445. 苹果和桔子

在本篇博客中,我们将深入探讨力扣(LeetCode)数据库题目1445 ------ "苹果和桔子"的详细解题步骤。我们会分析题目需求,然后详细解释SQL查询的构建过程,并对其时间复杂度进行分析。

题目描述

在数据库表Sales中记录了每日苹果和桔子的销售数据。我们的任务是编写SQL查询,以报告每天苹果和桔子销售数量的差异。查询结果需要按照sale_date字段的升序排列。

输入输出示例

输入 是一个名为Sales的表,结构如下:

sale_date fruit sold_num
2020-05-01 apples 10
2020-05-01 oranges 8
2020-05-02 apples 15
2020-05-02 oranges 15
2020-05-03 apples 20
2020-05-03 oranges 0
2020-05-04 apples 15
2020-05-04 oranges 16

输出 是一个包含sale_datediff(苹果与桔子销售数量差异)的表,关于给定示例的输出应如下:

sale_date diff
2020-05-01 2
2020-05-02 0
2020-05-03 20
2020-05-04 -1

解释:

  • 在 2020-05-01,卖了10个苹果和8个桔子(差异为 10 - 8 = 2)。
  • 在 2020-05-02,卖了15个苹果和15个桔子(差异为 15 - 15 = 0)。
  • 在 2020-05-03,卖了20个苹果和0个桔子(差异为 20 - 0 = 20)。
  • 在 2020-05-04,卖了15个苹果和16个桔子(差异为 15 - 16 = -1)。

解题思路

此题的关键在于理解如何区分苹果和桔子的销售数目,并计算它们的差值。为了实现这点,我们利用SUM函数结合IF语句,将苹果的销售数作为正值,桔子的销售数作为负值,然后对每天的销售记录求和,得到最终的差值。下面,我们将逐步解析这个过程。

SQL查询构建
  1. 利用SELECT语句,我们首先选择了sale_date作为需要返回的第一个字段。
  2. 应用SUMIF函数,若fruit列的值为'apples',则sold_num作为正数;否则,苹果之外的水果(此例中为桔子)计为负数,之后对这些值求和,得到diff
  3. 使用GROUP BY语句来按sale_date对结果进行分组,这样就可以为每天计算苹果和桔子销售数目的差异。
  4. 最后,利用ORDER BY语句确保结果按照日期的升序排列。

下面是整个SQL查询的代码:

sql 复制代码
SELECT
    sale_date,
    SUM(IF(fruit='apples', sold_num, -sold_num)) AS diff
FROM
    Sales
GROUP BY
    sale_date
ORDER BY
    sale_date ASC
复杂度分析

时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n是Sales表中的记录数。这是因为GROUP BY通常需要对数据进行排序,而排序的时间复杂度至少为 O ( n log ⁡ n ) O(n \log n) O(nlogn)。

总结

通过合理利用SQL的聚合函数和条件表达式,我们可以轻松构建出一个既简洁又高效的查询来解决问题。

相关推荐
草履虫建模2 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
fen_fen5 小时前
Oracle建表语句示例
数据库·oracle
砚边数影6 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt7 小时前
Djiango配置Celery
数据库·sqlite
VT.馒头7 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
云小逸7 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_5118 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总8 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你9 小时前
常用的 SQL 语句
数据库·sql·oracle
それども9 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql