【LeetCode 题解】数据库:1321.餐馆营业额变化增长
一、问题描述
本题给定了一个名为 Customer
的表,记录了餐馆顾客的交易数据,包括顾客 ID、姓名、访问日期和消费金额。作为餐馆老板,我们的任务是分析营业额的变化增长情况,具体来说,就是计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值,并按访问日期升序排序,同时要保留两位小数。
二、表结构分析
Customer
表的结构如下:
列名 | 类型 | 说明 |
---|---|---|
customer_id | int | 顾客的唯一标识,用于区分不同的顾客。 |
name | varchar | 顾客的姓名。 |
visited_on | date | 顾客访问餐馆的日期,与 customer_id 一起构成表的主键,确保每一条记录的唯一性。 |
amount | int | 顾客在当天的消费总额。 |
三、解题思路
-
确定时间段:要计算以 7 天为一个时间段的消费情况,我们需要对每个日期,找到其前 6 天以及当天的所有消费记录。
-
计算消费总和:对于每个确定的 7 天时间段,计算该时间段内的消费总额。
-
计算平均值:根据消费总和,计算出该 7 天时间段的平均消费金额,并保留两位小数。
-
结果排序:将计算得到的每个 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_on
、amount
列,并使用 ROUND(amount / 7, 2)
计算平均消费金额,保留两位小数,并将结果命名为 average_amount
。最后使用 ORDER BY visited_on
按访问日期升序排列结果。
六、复杂度分析
-
时间复杂度:假设
Customer
表中有n
条记录。最内层子查询使用窗口函数,对于每一行数据,窗口函数的计算时间复杂度为 (O(1))(因为窗口范围固定为 7 行),所以最内层子查询的时间复杂度为 (O(n))。中间子查询对最内层子查询的结果进行分组和筛选,时间复杂度也为 (O(n))。最外层查询对中间子查询的结果进行简单的选择和排序,排序的时间复杂度为 (O(n log n))。综合来看,总的时间复杂度为 (O(n log n))。 -
空间复杂度:在查询过程中,我们没有使用额外的与数据规模相关的空间,只是对表中的数据进行了读取和处理,因此空间复杂度为 (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 代码在数据库中运行,将得到的结果与预期输出进行对比,如果结果一致,则说明我们的代码实现是正确的。
感谢各位的阅读,后续将持续给大家讲解力扣中的算法题和数据库题,如果觉得这篇内容对你有帮助,别忘了点赞和关注,后续还有更多精彩的算法解析与你分享!
相关文章:
【LeetCode 题解】数据库:1321.餐馆营业额变化增长
一、问题描述 本题给定了一个名为 Customer 的表,记录了餐馆顾客的交易数据,包括顾客 ID、姓名、访问日期和消费金额。作为餐馆老板,我们的任务是分析营业额的变化增长情况,具体来说,就是计算以 7 天(某日…...
Apache Nifi安装与尝试
Apache NIFI中文文档 地址:https://nifichina.github.io/ 下载安装配置 1、环境准备 Nifi的运行需要依赖于java环境,所以本机上需要安装java环境,并配置环境变量。 1.1查看本机是否已经存在java环境 请先执行以下命令找出系统中真实可用…...
【Git 常用操作指令指南】
一、初始化与配置 1. 设置全局账户信息 git config --global user.name "用户名" # 设置全局用户名 git config --global user.email "邮箱" # 设置全局邮箱 --global 表示全局生效,若需针对单个仓库配置,可省略该参数 2.…...
Django 生成PDF文件
在这里,我们将学习如何使用Django视图设计和生成PDF文件。我们将使用ReportLab Python PDF库生成PDF,该库可以创建定制的动态PDF文件。 这是一个开源库,可以通过在Ubuntu中使用以下命令轻松下载。 $ pip install reportlab Python Copy …...
多账户使用Github的场景,设置 SSH 多账号使用特定 key
遇到多账户使用Github的场景,常难以管理ssh文件 解决方案: 你可以通过配置 ~/.ssh/config 文件,生成多个SSH key 让 Git 识别不同 key 来对应不同 GitHub 账号。 ✅ 正确的 key 类型有这些常见选项: rsa:老牌算法&a…...
js中this指向问题
在js中,this关键字的指向是一个比较重要的概念,它的值取决于函数的调用方式。 全局状态下 //全局状态下 this指向windowsconsole.log("this", this);console.log("thiswindows", this window); 在函数中 // 在函数中 this指向win…...
BabelDOC ,开源的 AI PDF 翻译工具
BabelDOC 是一款开源智能 PDF 翻译工具,专门为科学论文的翻译而设计。它能够在原文旁边生成翻译文本,实现双语对照,用户无需频繁切换窗口,极大提升了阅读的便利性。此外,BabelDOC 能够完整保留数学公式、表格和图形&am…...
Dify 生成提示词的 Prompt
Dify 生成提示词的 Prompt **第1次提示词****第2次提示词****第3次提示词**总结 Dify 生成提示词是,会和LLM进行3次交互,下面是和LLM进行交互是的Prompt。 以下是每次提示词的概要、目标总结以及原始Prompt: 第1次提示词 概要: …...
在nvim的snippet补全片段中增加函数注释的功能
一、补全片段路径 如果使用nvim,应当在nvim的snippet的插件中增加对应补全的片段,目前我所用的补全的片段路径如下: /home/zhaoky/.local/share/nvim/site/pack/packer/start/vim-snippets.git/snippets我当前补全的是c语言所以使用的片段是c.snippets…...
阿里云负载均衡为何费用高昂?——深度解析技术架构与市场定价策略
本文深度解析阿里云负载均衡(SLB)产品的定价体系,从技术架构、安全防护、合规成本三个维度揭示费用构成逻辑。通过2023年某跨国企业遭受的混合型DDoS攻击案例,结合Gartner最新安全支出报告,给出企业级负载均衡成本优化…...
大数据(7)Kafka核心原理揭秘:从入门到企业级实战应用
目录 一、大数据时代的技术革命1.1 消息中间件演进史1.2 Kafka核心设计哲学 二、架构深度解构2.1 核心组件拓扑2.1.1 副本同步机制(ISR) 2.2 生产者黑科技2.3 消费者演进路线 三、企业级应用实战3.1 金融行业实时风控3.2 物联网数据管道 四、生产环境优化…...
01背包 Java
① 记忆化搜索解法: import java.util.*; import java.io.*;public class Main {static int n, m;static int[] v, w;static int[][] memory; // 记忆化数组public static void main(String[] args) throws Exception {BufferedReader br new BufferedReader(new …...
【Kafka基础】消费者命令行完全指南:从基础到高级消费
Kafka消费者是消息系统的关键组成部分,掌握/export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-console-consumer.sh工具的使用对于调试、测试和监控都至关重要。本文将全面介绍该工具的各种用法,帮助您高效地从Kafka消费消息。 1 基础消费模式 1.1 从最…...
Seq2Seq - 编码器(Encoder)和解码器(Decoder)
本节实现一个简单的 Seq2Seq(Sequence to Sequence)模型 的编码器(Encoder)和解码器(Decoder)部分。 重点把握Seq2Seq 模型的整体工作流程 理解编码器(Encoder)和解码器(…...
@SchedulerLock 防止分布式环境下定时任务并发执行
背景 在一个有多个服务实例的分布式系统中,如果你用 Scheduled 来定义定时任务,所有实例都会执行这个任务。ShedLock 的目标是只让一个实例在某一时刻执行这个定时任务。 使用步骤 引入依赖 当前以redisTemplate为例子,MongoDB、Zookeeper…...
【力扣hot100题】(077)跳跃游戏
我最开始的想法还是太单纯了,最开始想着用回溯法,然后想到上一题的经验又想到了动态规划,虽然知道贪心题不太可能会这么复杂但实在想不出别的办法……果然我的智商做贪心题的极限就只能达到找零问题那种水平…… 最开始的方法,击…...
多光谱相机:林业监测应用(病虫害、外来物种、森林防火识别)
随着气候变暖和人类活动的增加,森林火灾发生的频率和强度都有所上升,而我国森林防火基础设施薄弱,监测预警体系不够完善,扑救能力和应急响应能力有待提高。气候变化导致气温升高、降水分布不均等,影响了树木的生长和发…...
Dynamic Programming(LeetCode 740)
740. 删除并获得点数 相关企业提示给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 开始你…...
虚拟列表react-virtualized使用(npm install react-virtualized)
1. 虚拟化列表 (List) // 1. 虚拟化列表 (List)import { List } from react-virtualized; import react-virtualized/styles.css; // 只导入一次样式// 示例数据 const list Array(1000).fill().map((_, index) > ({id: index,name: Item ${index},description: This is i…...
[特殊字符] 手机连接车机热点并使用 `iperf3` 测试网络性能
好的,以下是根据你的描述整理出来的步骤及解释: 📶 手机连接车机热点并使用 iperf3 测试网络性能 本文将通过 iperf3 来测试手机和车机之间的网络连接性能。我们会让车机作为服务端,手机作为客户端,进行 UDP 流量传输…...
C#,VB.NET正则表达式法替换代码
如何设置必须是MGBOX开头, msgbox这种注释自动跳过 在 Visual Studio 中使用 Ctrl H 进行替换操作时,若要确保仅替换以 MsgBox 开头的代码,同时跳过注释里的 MsgBox,可以利用正则表达式来实现。以下为你详细介绍操作步骤: 1. 打…...
从MySQL快速上手大数据Hive
从MySQL快速上手大数据Hive Hive简介 hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式(DML)来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查…...
基于华为云kubernetes的应用多活的示例
1 概述 为避免地域级别的故障,需要将单机房架构变成双地域架构(两个机房物理距离越远,网络延时越大,网延时是业务研发首先关注的)。单边写的多机房架构,是落地性比较大的一个方案,相对于单元化…...
Linux动态库 vs 静态库:创建步骤与优缺点对比
Linux系列 文章目录 Linux系列前言一、动静态库的概念引入1.1 库的基本概念1.2 静态库(Static Library)1.3 动态库(Dynamic Library)1.4 动静态库的核心区别 二、动静态库的实现2.1 静态库的创建及使用2.2 动态库的创建和使用三、…...
分析下HashMap容量和负载系数,它是怎么扩容的?
很好,我们继续深入分析 HashMap 中 容量(capacity) 和 负载因子(load factor),以及它是如何进行 扩容(resize) 的。 🧱 一、容量(capacity)与负载…...
Linux权限管理:从入门到实践
目录 引言 编辑一、Linux用户类型 二、文件访问者分类 三、文件类型和访问权限 (一)文件类型 (二)基本权限 四、文件访问权限设置方法 (一)chmod命令 (二)chown命令 &…...
计算机网络(1)
名称解析 名称解析:将名称解析成对应地址,名字-->IP 名称解析优点:便以记忆、解耦(断开直接的练习) 容器 mini的虚拟机,该容器地址是动态的、生命周期短暂;可实现登录功能 如果用户想要登录该…...
第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统
数据库实战入门:从零构建监控数据存储系统 前言 在物联网和系统监控领域,数据存储是核心基础环节。本文将通过MySQL/SQLite操作、数据库备份脚本和监控数据存储实战三个模块,带领初学者快速掌握数据库在真实场景中的应用。文章包含25个代码…...
编写文生视频提示词,制作抖音爆款视频
编写文生视频提示词,制作抖音爆款视频 一、理解文生视频提示词1.1 定义提示词1.1.1 提示词与创作工具的关系1.1.2 文生视频的功能 1.2 提示词的组成1.2.1 主体(Subject)1.2.2 动作(Action)1.2.3 场景(Scene…...
Linux: 线程控制
目录 一 前言 二 线程控制 1. POSIX线程库(原生线程库) 2. 创建线程 2.1 pthread_create 2.2pthread_self()获取线程id 3.线程终止 3.1.return 方式 3.2 pthread_exit 4 线程等待 三 理解线程tid 一 前言 在上一篇文章中我们已经学习了线程的概念,线程的创…...
为什么 npm list -g 没显示 node_modules?✨
揭秘:为什么 npm list -g 没显示 node_modules?🕵️♂️✨ 嗨,各位代码探险家!👋 今天我们要破解一个 npm 小谜团:运行 npm list -g --depth0 时,为什么输出的路径里看不到 node_…...
华为数字芯片机考2025合集4已校正
单选 1. 题目内容 影响芯片成本的主要因素是 Die Size 和封装,但电源、时钟等因素,特别是功耗对解决方案的成本影响较大,因此低成本设计需要兼顾低功耗设计:() 1. 解题步骤 1.1 分析题目 Die Size&…...
达摩院Paraformer-ONNX模型:一站式高精度中文语音识别工业级解决方案
文章目录 核心技术创新三大部署方案对比1. Docker极简部署(推荐)2. Python API直连调用3. 客户端实时测试工具 高阶调优技巧典型应用场景高频问题解决方案参考 阿里达摩院推出的speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-on…...
Llama 4的争议
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
React七案例下
代码下载 登录模块 用户登录 页面结构 新建 Login 组件,对应结构: export default function Login() {return (<div className{styles.root}><NavHeader className{styles.header}>账号登录</NavHeader><form className{styles.form}>&…...
Rust包管理与错误处理
文章目录 包管理箱(Crate)包(Package)模块(Module)访问权限use关键字 错误处理不可恢复错误可恢复错误错误传递kind方法 包管理 Rust的包管理有三个重要的概念,分别是箱、包、模块 箱…...
关于gitee的readme文档中的图片问题
使用markdown编辑readme文档,需要注意 添加图片,但是不显示问题 1.记得连图片一起上传到仓库中,不能只是在本地markdown文件中复制就结束了,因为存储的是本地图片地址,上传后找不到的 2.注意使用网络地址࿰…...
记录vscode连接不上wsl子系统下ubuntu18.04问题解决方法
记录vscode连接不上wsl子系统下ubuntu18.04问题解决方法 报错内容尝试第一次解决方法尝试第二次解决方法注意事项参考连接 报错内容 Unable to download server on client side: Error: Request downloadRequest failed unexpectedly without providing any details… Will tr…...
aws平台练习
注册 AWS 账户 访问 AWS 官方网站,点击“免费注册”按钮,按照提示完成账户注册: 提供电子邮件地址、密码和电话号码。 验证身份(可能需要手机验证码)。 设置 billing 信息。 2. 登录 AWS 管理控制台 使用注册的邮箱和…...
实战篇-梳理时钟树
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 前言 这是B站傅里叶的猫视频的笔记 一、建立工程 以Vivado的wave_gen为例子。为了引入异…...
【Hadoop入门】Hadoop生态之Hive简介
1 什么是Hive? 1.1 Hive概述 在大数据时代,如何让传统的数据分析师和SQL开发人员也能轻松处理海量数据?Hive应运而生。Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了一种类似SQL的查询语言(HQL)&a…...
DSP复习【3章】
F2812提供了XINTF用于扩展并行接口的外设芯片。 XINTF(外部接口)所需的时钟是 SYSCLKOUT 和 XTIMCLK。 所以正确答案是: ✅ SYSCLKOUT 和 XTIMCLK 什么是XREADY信号,如何使用? 章节例题: 1. 如何通过软件判…...
Hadoop案例——流量统计
Hadoop案例——流量统计 在大数据时代,流量统计是许多企业和组织的关键需求之一。通过分析网络流量数据,企业可以优化网络资源分配、提升用户体验、制定精准的营销策略等。本文将介绍如何使用 Hadoop 框架实现一个简单的流量统计案例,包括数…...
Linux管道 有名管道(FIFO)工作机制全解:从理论到实践
有名管道(重要) 有名管道/命名管道,主要用于没有血缘关系进程间的通信 当然也支持有血缘关系的情况,只是如果有血缘关系,没有必要使用有名管道,无名管道效果更佳 引入 好了,现在使用条件有了…...
java基础-修饰符
java修饰符 修饰符分类访问修饰符的作用域代码说明访问修饰符总览 非访问修饰符staticfinalabstractsynchronizedvolatiletransientnativestrictfp非访问修饰符总览表 非访问修饰符组合与冲突规则 修饰符分类 分类:访问修饰符 和 非访问修饰符 1.访问修饰符 公共…...
解锁基因密码之重测序(从测序到分析)
在生命科学的奇妙世界中,基因恰似一本记录着生命奥秘的“天书”,它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术,则是开启基因“天书”奥秘的一把神奇钥匙。 试想,你手中有一本经典书籍的通用版…...
当使用 Docker Desktop 启动 Tomcat 镜像时时间不对
当使用 Docker Desktop 启动 Tomcat 镜像时时间不对,可能由以下原因导致并可采取相应解决方法: 宿主机时间设置问题:Docker 容器的时间是由宿主机提供的,如果宿主机的时间不正确,那么容器的时间也会不正确。需确保宿主…...
golang gmp模型分析
思维导图: 1. 发展过程 思维导图: 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有: 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 处于对CPU资源的利用&…...
Redisson的RedLock与联锁(MultiLock)的区别
Redisson提供了两种分布式锁机制:RedLock(红锁)和MultiLock(联锁),它们在实现分布式锁时有重要区别。 1. RedLock (红锁) 设计原理: 基于Redis官方提出的Redlock算法实现目的是在Redis集群环境下提供更可靠的分布式锁需要至少3个独立的Redi…...
图灵逆向——题十-魔改算法
目录列表 过程分析JS代码还原代码实现运行结果 本题属于魔改标准加密算法,所以无法使用JS或Python中的标准库来进行模拟加密了,只能一步一步的还原它的环境咯。。。 过程分析 打开控制台发现有个无限debugger,直接过掉~[doge]。。。 OK过掉…...