【SQL】1321. 餐馆营业额变化增长(自连接;窗口函数rows between 、range between)

本文主要是介绍【SQL】1321. 餐馆营业额变化增长(自连接;窗口函数rows between 、range between),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前述

窗口函数相关知识推荐阅读:
通俗易懂的学会:SQL窗口函数
窗口函数rows between 、range between的使用
MySQL中的DATEDIFF()函数
mysql data类型的加减

常用函数:

  • ROUND() 函数:用于将数值四舍五入到指定的小数位数。
  • FLOOR() 函数:用于将数值向下取整,去掉小数部分,保留整数部分。
  • CEIL() 或 CEILING() 函数:用于将数值向上取整,进位到最接近的整数。

题目描述

leetcode 题目:1321. 餐馆营业额变化增长

在这里插入图片描述
在这里插入图片描述

思路

  1. 先按照日期分组
  2. 统计总额,平均额

写法一:自连接

思想:

  1. 先取出结果集中的所有visited_on字段,
  2. 再在其后连接其余字段并分组统计总额,平均额
select  B.visited_on, sum(C.amount) as amount,round(sum(C.amount)/7, 2) as average_amount 
from (select distinct date_add(A.visited_on, interval 6 day) as visited_onfrom Customer A where date_add(A.visited_on, interval 6 day) <= ( select B.visited_onfrom Customer Border by B.visited_on desclimit 1)) B 
join Customer C 
on datediff(B.visited_on, C.visited_on) between 0 and 6
group by B.visited_on
order by B.visited_on

date_add(A.visited_on, interval 6 day) # 在A.visited_on的日期基础上,加上6天

解析:B表是为了得到结果集当中的visited_on字段的所有值
在这里插入图片描述

将B表连接其余字段:

在这里插入图片描述
最后再按照visited_on字段分组(group by B.cisited_on),并用聚合函数SUM()计算总额及平均额等。

写法二:自连接

select C.visited_on,sum(D.amount) as amount,round(sum(D.amount)/7, 2) as average_amount
from(select distinct A.visited_on  --  C 表为只取出结果集当中的visited_on字段的所有值from Customer Awhere A.visited_on >= (select min(B.visited_on)from Customer B) + 6) C 
left join Customer D 
on datediff(C.visited_on, D.visited_on) between 0 and 6
group by C.visited_on
order by C.visited_on

写法三:窗口函数

学习题解中大佬的写法:整理两种主流的解决办法【自连接、窗口函数】,并部分改进

引用【窗口函数rows between 、range between的使用】的总结:

rows between 控制窗口函数的范围,使用rows between可以根据自己的需求任意的控制窗口函数的范围

  • UNBOUNDED :不受控的,无限的;
  • PRECEDING : 在…之前;
  • FOLLOWING: 在…之后;
select distinct visited_on,sum_amount as amount, round(sum_amount/7, 2) as average_amount
from (select visited_on, sum(amount) over(order by visited_on range interval 6 day preceding) as sum_amountfrom Customer) t
-- 最后手动地从第7天开始
where datediff(visited_on, (select MIN(visited_on) from Customer)) >= 6

这篇关于【SQL】1321. 餐馆营业额变化增长(自连接;窗口函数rows between 、range between)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770300

相关文章

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

MySQL zip安装包配置教程

《MySQLzip安装包配置教程》这篇文章详细介绍了如何使用zip安装包在Windows11上安装MySQL8.0,包括下载、解压、配置环境变量、初始化数据库、安装服务以及更改密码等步骤,感兴趣的朋... 目录mysql zip安装包配置教程1、下载zip安装包:2、安装2.1 解压zip包到安装目录2.2

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I