当前位置: 首页 > news >正文

1321. 餐館營業額變化增長

1321. 餐馆营业额变化增长

Question

表: Customer

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| customer_id   | int     |
| name          | varchar |
| visited_on    | date    |
| amount        | int     |
+---------------+---------+
在 SQL 中,(customer_id, visited_on) 是该表的主键。
该表包含一家餐馆的顾客交易数据。
visited_on 表示 (customer_id) 的顾客在 visited_on 那天访问了餐馆。
amount 是一个顾客某一天的消费总额。

你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。

计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount保留两位小数。

结果按 visited_on 升序排序

返回结果格式的例子如下。

示例 1:

输入:
Customer 表:
+-------------+--------------+--------------+-------------+
| customer_id | name         | visited_on   | amount      |
+-------------+--------------+--------------+-------------+
| 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         | 
+-------------+--------------+--------------+-------------+
输出:
+--------------+--------------+----------------+
| 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         |
+--------------+--------------+----------------+
解释:
第一个七天消费平均值从 2019-01-01 到 2019-01-07 是restaurant-growth/restaurant-growth/ (100 + 110 + 120 + 130 + 110 + 140 + 150)/7 = 122.86
第二个七天消费平均值从 2019-01-02 到 2019-01-08 是 (110 + 120 + 130 + 110 + 140 + 150 + 80)/7 = 120
第三个七天消费平均值从 2019-01-03 到 2019-01-09 是 (120 + 130 + 110 + 140 + 150 + 80 + 110)/7 = 120
第四个七天消费平均值从 2019-01-04 到 2019-01-10 是 (130 + 110 + 140 + 150 + 80 + 110 + 130 + 150)/7 = 142.86

Answer

with temp as(SELECTvisited_on,SUM(amount) as 'amount'FROMCustomerGROUP BY visited_on
)
SELECTb.visited_on,SUM(b.amount) as 'amount',ROUND(SUM(b.amount)/7,2) as 'average_amount'
FROMtemp b, temp a
WHERE DATEDIFF(b.visited_on,a.visited_on) BETWEEN 0 AND 6
GROUP BY a.visited_on
HAVING COUNT(*)=7

自連接方式 通過 DATEDIFF(b.visited_on,a.visited_on) BETWEEN 0 AND 6 得到七天的相加的幾個結果
並通過 HAVING COUNT(*)=7 限定加滿七天的
被GROUP BY的字段是開始時間,篩選後未被GROUP BY的字段為結尾時間(第七天)

| b.visited_on | a.visited_on | amount | average_amount |
| ------------ | ------------ | ------ | -------------- |
| 2019-01-07   | 2019-01-01   | 860    | 122.86         |
| 2019-01-08   | 2019-01-02   | 840    | 120            |
| 2019-01-09   | 2019-01-03   | 840    | 120            |
| 2019-01-10   | 2019-01-04   | 1000   | 142.86         |

方法二:

使用滑動窗口函數來計算當天到前七天的總的amount的值

with temp(min_visited) as ( #找到最早日期後續需要使用來找到第一個七天SELECT MIN(visited_on)FROMCustomer
)
SELECT
visited_on,
amount,
ROUND(amount/7,2) as 'average_amount'
FROM(SELECT #滑動窗口獲取 前七天的總數DISTINCT visited_on,SUM(amount) OVER(ORDER BY visited_on range interval 6 day preceding) 'amount'FROMCustomer) t, temp
WHERE DATEDIFF(t.visited_on,temp.min_visited) >=6
SELECT #滑動窗口獲取 前七天的總數DISTINCT visited_on,SUM(amount) OVER(ORDER BY visited_on range interval 6 day preceding) 'amount'
FROMCustomer
output:
| visited_on | amount |
| ---------- | ------ |
| 2019-01-01 | 100    |
| 2019-01-02 | 210    |
| 2019-01-03 | 330    |
| 2019-01-04 | 460    |
| 2019-01-05 | 570    |
| 2019-01-06 | 710    |
| 2019-01-07 | 860    |
| 2019-01-08 | 840    |
| 2019-01-09 | 840    |
| 2019-01-10 | 1000   |

根據最早的日期計算第一個七天的日期

可以通過WHERE 子查詢的方式

WHERE datediff(visited_on, (select min(visited_on) from Customer))>=6

或者 通過WITH 的方式事先查好

with temp(min_visited) as ( #找到最早日期後續需要使用來找到第一個七天SELECT MIN(visited_on)FROMCustomer
)WHERE DATEDIFF(t.visited_on,temp.min_visited) >=6

滑動窗口函數:

OVER(ORDER BY column rows/range子句<用於定義視窗大小>)

ROWS: 表示按照行的範圍來定義,根據order by 子句排序後,取的前N行或後N行的數據計算,只與排序後的行符相關
常用: rows n perceding 當前行到前n行
RANGE: 表示按照值的範圍來定義, 根據order by 子句排序後,指定當前行對應值的範圍取值,行數不固定
適用於日期,時間,數值排序分組

邊界可取值(Start expr & End expr)說明
Current Row當前行
N preceding前 n 行,n 為數位, 比如 2 Preceding 表示前 2 行
unbonded preceding開頭
N following後N行,n 為數位, 比如 2 following 表示後2行
unbounded following結尾
range取特定日期區間說明
range interval 7-1 day preceding最近7天的值
range between interval 1 day preceding and interval 1 day following前後一天和當天的值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AtCoder Beginner Contest 370(A~E)
  • php转职golang第二期
  • 新学期学生资料在线收集,老师用它一分钟搞定!
  • 【Unity基础】Input中GetAxis和GetAxisRaw的区别
  • 【Android】程序开发组件—探究Jetpack
  • 【数据结构】顺序表和链表——链表(包含大量经典链表算法题)
  • 资深研发的心愿:PostgreSQL未来若能加入这些功能,将更臻完善
  • 数据结构详细解释
  • 位运算+前缀和+预处理,CF 1017D - The Wu
  • CCF推荐A类会议和期刊总结(计算机网络领域)- 2022
  • 5、Kafka
  • HTML高级技术解析与实践指南
  • Windows环境下 VS2022 编译 LAME 源码
  • 【Redis】为什么选择 Redis 做缓存?
  • 【ShuQiHere】初识 Node.js:服务器端 JavaScript 的强大之处
  • 【comparator, comparable】小总结
  • C++11: atomic 头文件
  • Fundebug计费标准解释:事件数是如何定义的?
  • java多线程
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • ReactNativeweexDeviceOne对比
  • Spring Cloud Feign的两种使用姿势
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 爱情 北京女病人
  • 代理模式
  • 观察者模式实现非直接耦合
  • 将回调地狱按在地上摩擦的Promise
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 三栏布局总结
  • 线上 python http server profile 实践
  • 正则与JS中的正则
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # .NET Framework中使用命名管道进行进程间通信
  • #HarmonyOS:基础语法
  • (02)Unity使用在线AI大模型(调用Python)
  • (04)odoo视图操作
  • (2)(2.10) LTM telemetry
  • (4.10~4.16)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)大型网站架构演变和知识体系
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net 中viewstate的原理和使用
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET企业级应用架构设计系列之技术选型
  • .net中我喜欢的两种验证码