【LeetCode 题解】数据库:1321.餐馆营业额变化增长

一、问题描述

本题给定了一个名为 Customer 的表,记录了餐馆顾客的交易数据,包括顾客 ID、姓名、访问日期和消费金额。作为餐馆老板,我们的任务是分析营业额的变化增长情况,具体来说,就是计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值,并按访问日期升序排序,同时要保留两位小数。

二、表结构分析

Customer 表的结构如下:

列名类型说明
customer_idint顾客的唯一标识,用于区分不同的顾客。
namevarchar顾客的姓名。
visited_ondate顾客访问餐馆的日期,与 customer_id 一起构成表的主键,确保每一条记录的唯一性。
amountint顾客在当天的消费总额。

三、解题思路

  1. 确定时间段:要计算以 7 天为一个时间段的消费情况,我们需要对每个日期,找到其前 6 天以及当天的所有消费记录。

  2. 计算消费总和:对于每个确定的 7 天时间段,计算该时间段内的消费总额。

  3. 计算平均值:根据消费总和,计算出该 7 天时间段的平均消费金额,并保留两位小数。

  4. 结果排序:将计算得到的每个 7 天时间段的访问日期、消费总额和平均消费金额按访问日期升序排列输出。

为了实现以上思路,我们可以使用 SQL 中的窗口函数来简化计算过程,窗口函数可以在不改变表结构的情况下,对数据进行分组和聚合操作。

四、SQL 代码实现

-- 选择访问日期、消费总额和平均消费金额
SELECT visited_on,amount,-- 保留两位小数ROUND(amount / 7, 2) AS average_amount
FROM (-- 子查询计算每个 7 天时间段的消费总额SELECT visited_on,SUM(amount) AS amountFROM (-- 使用窗口函数计算每个日期及其前 6 天的消费总和SELECT visited_on,SUM(amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS amountFROM Customer) sub1WHERE visited_on >= (SELECT MIN(visited_on) FROM Customer + INTERVAL 6 DAY)GROUP BY visited_on) sub2
ORDER BY visited_on;

五、代码详细解释

1、最内层子查询

SELECT visited_on,SUM(amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS amount
FROM Customer

这里使用了窗口函数 SUM(amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)OVER 子句指定了窗口的定义,ORDER BY visited_on 表示按照访问日期进行排序,ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 表示窗口的范围是当前行以及其前 6 行。所以这个子查询的作用是计算每个日期及其前 6 天的消费总和,并将结果命名为 amount

2、中间子查询

SELECT visited_on,SUM(amount) AS amount
FROM (最内层子查询) sub1
WHERE visited_on >= (SELECT MIN(visited_on) FROM Customer + INTERVAL 6 DAY)
GROUP BY visited_on

这个子查询首先从最内层子查询的结果中选择 visited_on 和 amount 列。WHERE 子句用于筛选出访问日期大于等于最早访问日期加上 6 天的记录,因为在最早访问日期加上 6 天之前的日期无法构成完整的 7 天时间段。然后使用 GROUP BY visited_on 对结果按访问日期进行分组,并再次计算每个分组(即每个 7 天时间段)的消费总额,将结果命名为 amount

3、最外层查询

SELECT visited_on,amount,ROUND(amount / 7, 2) AS average_amount
FROM (中间子查询) sub2
ORDER BY visited_on;

最外层查询从中间子查询的结果中选择 visited_onamount 列,并使用 ROUND(amount / 7, 2) 计算平均消费金额,保留两位小数,并将结果命名为 average_amount。最后使用 ORDER BY visited_on 按访问日期升序排列结果。

六、复杂度分析

  1. 时间复杂度:假设 Customer 表中有 n 条记录。最内层子查询使用窗口函数,对于每一行数据,窗口函数的计算时间复杂度为 (O(1))(因为窗口范围固定为 7 行),所以最内层子查询的时间复杂度为 (O(n))。中间子查询对最内层子查询的结果进行分组和筛选,时间复杂度也为 (O(n))。最外层查询对中间子查询的结果进行简单的选择和排序,排序的时间复杂度为 (O(n log n))。综合来看,总的时间复杂度为 (O(n log n))。

  2. 空间复杂度:在查询过程中,我们没有使用额外的与数据规模相关的空间,只是对表中的数据进行了读取和处理,因此空间复杂度为 (O(1))。

七、测试用例验证

1、输入数据

-- 插入示例数据
INSERT INTO Customer (customer_id, name, visited_on, amount) VALUES
(1, 'Jhon', '2019-01-01', 100),
(2, 'Daniel', '2019-01-02', 110),
(3, 'Jade', '2019-01-03', 120),
(4, 'Khaled', '2019-01-04', 130),
(5, 'Winston', '2019-01-05', 110), 
(6, 'Elvis', '2019-01-06', 140), 
(7, 'Anna', '2019-01-07', 150),
(8, 'Maria', '2019-01-08', 80),
(9, 'Jaze', '2019-01-09', 110), 
(1, 'Jhon', '2019-01-10', 130), 
(3, 'Jade', '2019-01-10', 150);

2、预期输出

+--------------+--------------+----------------+
| visited_on   | amount       | average_amount |
+--------------+--------------+----------------+
| 2019-01-07   | 860          | 122.86         |
| 2019-01-08   | 840          | 120            |
| 2019-01-09   | 840          | 120            |
| 2019-01-10   | 1000         | 142.86         |
+--------------+--------------+----------------+

3、验证过程:将上述 SQL 代码在数据库中运行,将得到的结果与预期输出进行对比,如果结果一致,则说明我们的代码实现是正确的。

感谢各位的阅读,后续将持续给大家讲解力扣中的算法题和数据库题,如果觉得这篇内容对你有帮助,别忘了点赞和关注,后续还有更多精彩的算法解析与你分享!

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

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

相关文章

【Python】读取xlsb或xlsx的单一或连续单元格工具类

代码主要来自Kimi.ai,有修改。 优先使用工作表序号索引工作表,序号从1开始。 运行需要先安装openpyxl和pyxlsb两个第三方库。 import openpyxl from openpyxl.utils import range_boundaries from pyxlsb import open_workbook as open_xlsbclass Exc…

【蓝桥杯】动态规划:背包问题

这篇文章主要记录动态规划方面的学习。 动态规划的核心思想: 把大问题分解成小问题,记住小问题的解,避免重复计算。 动态规划(DP)的三大特点: ①最优子结构:大问题的最优解可以由小问题的最优解推导出来 ②重叠子问题:在求解过程中会反复遇到相同的小问题 ③无后效…

华为数字芯片机考2025合集1已校正

单选 1.以下低功耗措施中,哪种不是降低电路翻转率的方法? A.在不进行算术运算的时候,使这些模块的输入保持不变,不让新的操作数进来 B.采用Gray 码或One‐hot 码作为状态机编码 C.减少电路中的glitch D.重新安排“if‐else”表达…

React 列表渲染

开发环境:Reacttsantd 你可能经常需要通过 JavaScript 的数组方法 来操作数组中的数据,从而将一个数据集渲染成多个相似的组件。在这篇文章中,你将学会如何在 React 中使用 filter() 筛选需要渲染的组件和使用 map() 把数组转换成组件数组。 …

力扣刷题DAY11(动态规划-线性DP)

一、最长上升子序列 300. 最长递增子序列 &#xff08;一&#xff09;初版代码 class Solution { public:int lengthOfLIS(vector<int>& nums) {int n nums.size();vector<int> f(n 1, 1); //初始化为1&#xff0c;因为每个数至少可以作为一个单独的序列in…

DFS--

数字的全排列 #include <bits/stdc.h> using namespace std;//最大的排列数目 const int N10; int n; //存储排列的路径 int path[N]; //标记数字是否已经被使用 bool st[N];void dfs(int u){//到达递归边界&#xff0c;输出一个排列if(un){//输出循环for(int i0; i<…

栈与队列及其基础应用

一.栈 1.栈的定义 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。其结构可以参考羽毛…

openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0

openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0 1、配置 yum 华为源2、安装依赖3、源码安装 openssl 1.0.1u3.1、openssl 1.1.1 降级到 openssl 1.0.1 4、源码安装 python 2.75、使用 pip3 安装 Python 相关依赖6、编译安装 Greenplum-db 6.20.06.1、修改配置6.2、基于…

机器学习02——概要

一、简介 机器学习是一门在没有明确编程的情况下让计算机学习的科学。 监督学习是有目标的&#xff0c;输入数据对应明确的输出&#xff1b;无监督学习则是“探索”型的&#xff0c;模型的目标是从数据中发现潜在的模式或结构&#xff0c;而不需要预先知道标签。 二、机器学…

swift-08-属性、汇编分析inout本质

一、Swift中跟实例相关的属性可以分为2大类 1.1 存储属性&#xff08; Stored Property&#xff09; 类似于成员变量这个概念 存储在实例的内存中 结构体、类可以定义存储属性 枚举不可以定义存储属性&#xff08;因为枚举只存储关联值和case&#xff09; 1.2 计算属性&am…

【HarmonyOS Next之旅】DevEco Studio使用指南(十二)

目录 1 -> Code Linter代码检查 2 -> 配置代码检查规则 3 -> 查看/处理代码检查结果 1 -> Code Linter代码检查 Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。 可根据扫描结果中告警提示手工修复代码缺陷&#xff0c;或者执行一键式自动修复…

前端vue项目打包成桌面端exe应用

主要 使用 Electron将 vue项目打包为 exe 1.首先下载Electron git clone https://github.com/electron/electron-quick-start cd electron-quick-start npm install安装完依赖之后 npm start运行成功 注意&#xff1a;如果你的项目使用了VueRouter&#xff0c;那么切记&…

基于springcloud的“微服务架构的巡游出租管理平台”的设计与实现(源码+数据库+文档+PPT)

基于springcloud的“微服务架构的巡游出租管理平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springcloud 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 E-R实体关系图…

新一代达梦官方管理工具SQLark:可视化建表操作指南

在数据库管理工作中&#xff0c;新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接&#xff1a;www.sqlark.com 新建表作为常见的功能&#xff0c;相比其他管理工具&#xff0c;…

Scala相关知识学习总结6

1、集合计算高级函数说明 - 过滤&#xff1a;遍历集合&#xff0c;提取满足特定条件的元素组成新集合。 - 转化/映射&#xff08;map&#xff09;&#xff1a;将集合里的每个元素应用到指定函数进行转换。 - 扁平化&#xff1a;文档未详细阐述其具体含义和操作。 - 扁平化映射&…

pandas.DataFrame.dtypes--查看和验证 DataFrame 列的数据类型!

查看每列的数据类型&#xff0c;方便分析是否需要数据类型转换 property DataFrame.dtypes[source] Return the dtypes in the DataFrame. This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. Columns with…

计算机中的单位

在计算机科学中&#xff0c;单位用于衡量数据存储、内存、数据传输速率等。以下是一些常见的计算机单位及其含义&#xff1a; ### **1. 数据存储单位** 数据存储单位用于衡量计算机存储设备&#xff08;如硬盘、内存、闪存等&#xff09;的容量。 | 单位 | 符号 | 含义…

Spring Boot 自定义配置类(包含字符串、数字、布尔、小数、集合、映射、嵌套对象)实现步骤及示例

Spring Boot 自定义配置类实现步骤及示例 步骤说明 创建配置类&#xff1a;定义一个 POJO 类&#xff0c;使用 ConfigurationProperties 注解指定配置前缀。启用配置绑定&#xff1a;在启动类或配置类上添加 EnableConfigurationProperties 注解。配置文件写法&#xff1a;在 …

Linux: 线程控制

目录 一 前言 二 线程控制 1. POSIX线程库(原生线程库) 2. 创建线程 2.1 pthread_create 2.2pthread_self()获取线程id 3.线程终止 3.1.return 方式 3.2 pthread_exit 4 线程等待 三 理解线程tid 一 前言 在上一篇文章中我们已经学习了线程的概念&#xff0c;线程的创…

避开养生误区,拥抱健康生活

在追求健康的道路上&#xff0c;我们常常会陷入一些养生误区&#xff0c;不仅无法达到预期效果&#xff0c;还可能损害身体健康。只有拨云见日&#xff0c;认清这些误区&#xff0c;采取正确的养生方式&#xff0c;才能真正拥抱健康生活。​ 很多人认为&#xff0c;保健品吃得…