【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.pswp.cn/diannao/77308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77308.shtml
英文地址,請注明出處:http://en.pswp.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;保健品吃得…