SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL題解:店鋪動銷率與滯銷率計算

關鍵:只要當天任一店鋪有任何商品的銷量就輸出該天的結果,即使店鋪901當天的動銷率為0。

潛臺詞:?輸出邏輯與店鋪901的銷售情況無關,只取決于平臺整體是否有銷售記錄。?

  • ?表面理解?:計算店鋪901的動銷率 → 應該只關注901的數據
  • ?實際規則?:只要全平臺當天有任何銷售(哪怕不是901的),就必須輸出901這天的結果
條件是否輸出
全平臺當天有任意銷售? 必須輸出(即使901銷售為0)
全平臺當天無任何銷售? 不輸出

題目理解

題目要求計算店鋪901在2021年國慶頭3天(10月1日-10月3日)的7日動銷率和滯銷率,結果保留3位小數,按日期升序排序。

關鍵定義

  • ?動銷率?:一段時間內有銷量的商品占當前已上架總商品數的比例
  • ?滯銷率?:一段時間內沒有銷量的商品占當前已上架總商品數的比例

特殊要求

"只要當天任一店鋪有任何商品的銷量就輸出該天的結果,即使店鋪901當天的動銷率為0"

解題思路分析

1. 數據準備

首先需要從三個表中獲取必要信息:

  • tb_order_overall:訂單基本信息
  • tb_order_detail:訂單商品明細
  • tb_product_info:商品信息(店鋪ID在這里)

2. 核心邏輯

  1. 確定需要計算的日期范圍(10月1日-10月3日)
  2. 計算7日滾動窗口內的動銷商品數
  3. 計算當前已上架的商品總數
  4. 計算動銷率和滯銷率

SQL代碼解析

CTE部分

date_range表:獲取平臺有銷售記錄的日期
  date_range AS (SELECT DISTINCT DATE(event_time) AS order_dateFROM tb_order_overallWHERE DATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03')
  • 從訂單總表中篩選出國慶3天內有銷售記錄的日期
  • 使用distinct確保日期不重復
shop_products?表:獲取店鋪901的銷售記錄
shop_products AS (SELECTDATE(a.event_time) AS order_date,b.product_idFROMtb_order_overall aJOIN tb_order_detail b ON a.order_id = b.order_id AND a.status = 1JOIN tb_product_info c ON b.product_id = c.product_id AND c.shop_id = '901')
  • 關聯三個表獲取店鋪901的有效訂單(status=1)的商品記錄
  • 結果包含日期和商品ID
product_counts?表:計算每日在售商品數
product_counts AS (SELECTDATE(o.event_time) AS order_date,COUNT(DISTINCT p.product_id) AS total_products
FROMtb_order_overall oCROSS JOIN tb_product_info p -- 顯式交叉連接
WHEREp.shop_id = '901'AND DATEDIFF(DATE(o.event_time), DATE(p.release_time)) >= 0
GROUP BYDATE(o.event_time)
)
  • 計算店鋪901在每個訂單日期時已經上架的商品總數
  • DATEDIFF(...) >= 0:只保留商品上架時間早于或等于訂單日期的記錄
  • 使用逗號,表示的是隱式交叉連接?(CROSS JOIN),這會生成兩個表的笛卡爾積

商品表?(p):

product_id | shop_id | release_time
----------------------------
8001      | 901     | 2020-01-01
8002      | 901     | 2020-01-01
8003      | 901     | 2021-09-01

?訂單表?(o):

order_id | event_time
---------------------
301004   | 2021-10-01
301005   | 2021-10-02
301003   | 2021-10-03

連接后會產生 3商品 × 3訂單 = 9行中間結果:

product_id | shop_id | release_time | order_id | event_time
-----------------------------------------------------------
8001       | 901     | 2020-01-01   | 301004   | 2021-10-01
8001       | 901     | 2020-01-01   | 301005   | 2021-10-02
8001       | 901     | 2020-01-01   | 301003   | 2021-10-03
8002       | 901     | 2020-01-01   | 301004   | 2021-10-01
8002       | 901     | 2020-01-01   | 301005   | 2021-10-02
8002       | 901     | 2020-01-01   | 301003   | 2021-10-03
8003       | 901     | 2021-09-01   | 301004   | 2021-10-01
8003       | 901     | 2021-09-01   | 301005   | 2021-10-02
8003       | 901     | 2021-09-01   | 301003   | 2021-10-03

按訂單日期分組后,計算每個日期的唯一商品數:

order_date | COUNT(DISTINCT p.product_id)
---------------------------
2021-10-01 | 3 (8001,8002,8003都已上架)
2021-10-02 | 3
2021-10-03 | 3

主查詢部分

SELECTdr.order_date AS dt,ROUND(COUNT(DISTINCT sp.product_id) / AVG(pc.total_products),3) AS sale_rate,ROUND(1 - COUNT(DISTINCT sp.product_id) / AVG(pc.total_products),3) AS unsale_rate
FROMdate_range drLEFT JOIN shop_products sp ON DATEDIFF(dr.order_date, sp.order_date) BETWEEN 0 AND 6JOIN product_counts pc ON dr.order_date = pc.order_date
GROUP BYdr.order_date
ORDER BYdr.order_date
  • 計算動銷率和滯銷率
  • ?date_range dr?:國慶3天的日期(10月1日、2日、3日)
  • ?LEFT JOIN shop_products?:關聯7天內的銷售記錄
    • DATEDIFF(dr.order_date, sp.order_date) BETWEEN 0 AND 6表示:
      • 0:當天
      • 6:7天前(含當天共7天)
  • ?JOIN product_counts?:關聯每天的商品總數

  • 分子?:COUNT(DISTINCT sp.product_id)
    • 計算7天內銷售過的不同商品數量
  • ?分母?:AVG(pc.total_products)
    • 因為pc已經按日期分組,每個日期只有一行,AVG相當于直接取值
    • 表示當天已上架的商品總數
  • ?ROUND(..., 3)??:保留3位小數

關鍵理解要點

  1. ?時間窗口?:每個日期的前7天(含當天)
  2. ?三層數據組合?:
    • 基礎日期 + 7天內銷售記錄 + 當日商品總數
  3. ?LEFT JOIN的意義?:確保無銷售日也能顯示
  4. ?AVG的使用場景?:對單值分組列的巧妙處理


    自建測試數據

    USE niuke_mall;-- (1)創建商品信息表
    CREATE TABLE tb_product_info (id INT AUTO_INCREMENT PRIMARY KEY,product_id INT NOT NULL,shop_id INT NOT NULL,tag VARCHAR(20),in_price DECIMAL(10,2) NOT NULL,quantity INT NOT NULL,release_time DATETIME NOT NULL
    );-- 插入測試數據
    INSERT INTO tb_product_info (product_id, shop_id, tag, in_price, quantity, release_time) VALUES
    -- 901店鋪的商品(3個)
    (8001, 901, '日用', 60.00, 1000, '2020-01-01 10:00:00'),  -- 長期在售商品
    (8002, 901, '零食', 140.00, 500, '2020-01-01 10:00:00'), -- 長期在售商品
    (8003, 901, '零食', 160.00, 500, '2021-09-01 10:00:00'), -- 較晚上架商品-- 902店鋪的商品(3個)
    (8004, 902, '電子', 1200.00, 200, '2021-08-15 10:00:00'), -- 高單價商品
    (8005, 902, '電子', 800.00, 150, '2021-09-15 10:00:00'),  -- 中等單價商品
    (8006, 902, '配件', 50.00, 1000, '2021-10-01 10:00:00'),  -- 新上架商品-- 903店鋪的商品(4個)
    (8007, 903, '服裝', 200.00, 300, '2021-07-01 10:00:00'),  -- 夏季服裝
    (8008, 903, '服裝', 300.00, 250, '2021-09-01 10:00:00'),  -- 秋季服裝
    (8009, 903, '鞋帽', 400.00, 200, '2021-09-15 10:00:00'),  -- 鞋類商品
    (8010, 903, '鞋帽', 350.00, 180, '2021-10-01 10:00:00');  -- 新上架鞋類-- (2)創建訂單總表
    CREATE TABLE tb_order_overall (id INT AUTO_INCREMENT PRIMARY KEY,order_id INT NOT NULL,uid INT NOT NULL,event_time DATETIME NOT NULL,total_amount DECIMAL(10,2) NOT NULL,total_cnt INT NOT NULL,`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1-已完成'
    );-- 插入測試數據
    INSERT INTO tb_order_overall (order_id, uid, event_time, total_amount, total_cnt, status) VALUES
    -- 國慶前訂單(3個)
    (301001, 101, '2021-09-28 10:00:00', 300.00, 2, 1),  -- 901店鋪訂單
    (301002, 102, '2021-09-29 11:00:00', 450.00, 3, 1),  -- 902店鋪訂單
    (301003, 103, '2021-09-30 14:00:00', 200.00, 1, 1),  -- 903店鋪訂單-- 國慶期間訂單(9個)
    -- 10月1日
    (301004, 101, '2021-10-01 10:00:00', 170.00, 1, 1),  -- 901店鋪訂單
    (301005, 102, '2021-10-01 11:00:00', 800.00, 1, 1),  -- 902店鋪訂單
    (301006, 103, '2021-10-01 14:00:00', 350.00, 1, 1),  -- 903店鋪訂單-- 10月2日
    (301007, 104, '2021-10-02 09:00:00', 300.00, 2, 1),  -- 901店鋪訂單
    (301008, 105, '2021-10-02 10:30:00', 1200.00, 1, 1), -- 902店鋪訂單
    (301009, 106, '2021-10-02 15:00:00', 600.00, 2, 1),  -- 903店鋪訂單-- 10月3日
    (301010, 107, '2021-10-03 10:00:00', 235.00, 2, 1),  -- 901店鋪訂單
    (301011, 108, '2021-10-03 11:30:00', 1600.00, 2, 1), -- 902店鋪訂單
    (301012, 109, '2021-10-03 16:00:00', 950.00, 3, 1);  -- 903店鋪訂單-- (3)創建訂單明細表
    CREATE TABLE tb_order_detail (id INT AUTO_INCREMENT PRIMARY KEY,order_id INT NOT NULL,product_id INT NOT NULL,price DECIMAL(10,2) NOT NULL,cnt INT NOT NULL
    );-- 插入測試數據
    INSERT INTO tb_order_detail (order_id, product_id, price, cnt) VALUES
    -- 國慶前訂單明細
    (301001, 8002, 150.00, 2),  -- 901店鋪商品
    (301002, 8004, 400.00, 1),  -- 902店鋪商品
    (301002, 8005, 800.00, 1),  -- 902店鋪商品
    (301002, 8006, 50.00, 1),   -- 902店鋪商品
    (301003, 8007, 200.00, 1),  -- 903店鋪商品-- 國慶期間訂單明細
    -- 10月1日
    (301004, 8002, 170.00, 1),  -- 901店鋪商品
    (301005, 8005, 800.00, 1),  -- 902店鋪商品
    (301006, 8010, 350.00, 1),  -- 903店鋪商品-- 10月2日
    (301007, 8002, 150.00, 1),  -- 901店鋪商品
    (301007, 8003, 150.00, 1),  -- 901店鋪商品
    (301008, 8004, 1200.00, 1), -- 902店鋪商品
    (301009, 8008, 300.00, 2),  -- 903店鋪商品-- 10月3日
    (301010, 8001, 85.00, 1),   -- 901店鋪商品
    (301010, 8003, 150.00, 1),  -- 901店鋪商品
    (301011, 8004, 1200.00, 1), -- 902店鋪商品
    (301011, 8005, 400.00, 1),  -- 902店鋪商品
    (301012, 8007, 200.00, 1),  -- 903店鋪商品
    (301012, 8008, 300.00, 1),  -- 903店鋪商品
    (301012, 8009, 450.00, 1);  -- 903店鋪商品

    參考大佬們的回答

    題解 | #店鋪901國慶期間的7日動銷率和滯銷率#_牛客博客

    題解 | #店鋪901國慶期間的7日動銷率和滯銷率#_牛客博客

     -- 定義日期范圍CTE,獲取2021-10-01到2021-10-03期間的所有訂單日期
    WITH-- 步驟1:確定要計算的日期范圍(國慶3天)date_range AS (SELECT DISTINCTDATE(event_time) AS order_dateFROMtb_order_overallWHEREDATE(event_time) BETWEEN '2021-10-01' AND '2021-10-03'),-- 步驟2:找出901店鋪有銷售的商品和銷售日期shop_products AS (SELECTDATE(a.event_time) AS order_date,b.product_idFROMtb_order_overall aJOIN tb_order_detail b ON a.order_id = b.order_idAND a.status = 1JOIN tb_product_info c ON b.product_id = c.product_idAND c.shop_id = '901'),-- 定義產品總數CTE,計算901店鋪每天可銷售的產品總數product_counts as (SELECTDATE(o.event_time) AS order_date,COUNT(DISTINCT p.product_id) AS total_productsFROMtb_order_overall oCROSS JOIN tb_product_info p -- 顯式交叉連接WHEREp.shop_id = '901'AND DATEDIFF(DATE(o.event_time), DATE(p.release_time)) >= 0GROUP BYDATE(o.event_time))-- 主查詢:計算每天的產品銷售率和未銷售率-- 最終計算
    SELECTdr.order_date AS dt,ROUND(COUNT(DISTINCT sp.product_id) / AVG(pc.total_products),3) AS sale_rate,ROUND(1 - COUNT(DISTINCT sp.product_id) / AVG(pc.total_products),3) AS unsale_rate
    FROMdate_range drLEFT JOIN shop_products sp ON DATEDIFF(dr.order_date, sp.order_date) BETWEEN 0 AND 6JOIN product_counts pc ON dr.order_date = pc.order_date
    GROUP BYdr.order_date
    ORDER BYdr.order_date
    

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/90886.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/90886.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/90886.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    PytorchLightning最佳實踐基礎篇

    PyTorch Lightning(簡稱 PL)是一個建立在 PyTorch 之上的高層框架,核心目標是剝離工程代碼與研究邏輯,讓研究者專注于模型設計和實驗思路,而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

    Apache Flink 實時流處理性能優化實踐指南

    Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長,Apache Flink 已經成為主流的流處理引擎。然而,在生產環境中,高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

    ubuntu上將TempMonitor加入開機自動運行的方法

    1.新建一個TempMonitor.sh文件,內容如下:#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…

    速賣通自養號測評技術解析:IP、瀏覽器與風控規避的實戰方案

    一、速賣通的“春天”來了,賣家如何抓住機會?2025年的夏天,速賣通的風頭正勁。從沙特市場躍升為第二大電商平臺,到8月大促返傭力度升級,平臺對優質商家的扶持政策越來越清晰。但與此同時,競爭也愈發激烈——…

    adb: CreateProcessW failed: 系統找不到指定的文件

    具體錯誤 adb devices * daemon not running; starting now at tcp:5037 adb: CreateProcessW failed: 系統找不到指定的文件。 (2) * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon 下載最新的platform-tools-windows 下載最新…

    Centos安裝HAProxy搭建Mysql高可用集群負載均衡

    接上文MYSQL高可用集群搭建–docker https://blog.csdn.net/weixin_43914685/article/details/149647589?spm1001.2014.3001.5501 連接到你搭建的 Percona XtraDB Cluster (PXC) 數據庫集群,實現高可用性和負載均衡,建議使用一個中間件來管理這些連接。…

    Sql server開掛的OPENJSON

    以前一直用sql server2008,自從升級成sql server2019后,用OPENJSON的感覺像開掛,想想以前表作為參數傳輸時的痛苦,不堪回首。一》不堪回首 為了執行效率,很多時候希望將表作為參數傳給數據庫的存儲過程。存儲過程支持自…

    【數據結構】隊列和棧練習

    1.用隊列實現棧 225. 用隊列實現棧 - 力扣(LeetCode) typedef int QDatatype; typedef struct QueueNode {struct QueueNode *next;QDatatype data; }QNode;typedef struct Queue {QNode* head;QNode* tail;QDatatype size; }Que;typedef struct {Que…

    LabVIEW二維碼實時識別

    ?LabVIEW通過機器視覺技術,集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化,解決復雜環境下二維碼識別效率低、準確率不足問題,滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

    微服務-springcloud-springboot-Skywalking詳解(下載安裝)

    一、SkyWalking核心介紹 1. 什么是SkyWalking? Apache SkyWalking是一款國人主導開發的開源APM(應用性能管理)系統,2015年由吳晟創建,2017年進入Apache孵化器,2019年畢業成為Apache頂級項目。它通過分布式…

    Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

    在最近使用 Elasticsearch 的過程中,我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試,最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面,詳細記錄這次踩坑…

    使用idea 將一個git分支的部分記錄合并到git另一個分支

    場景: 有多個版本分支,需要將其中一個分支的某一兩次提交合并到指定分支上 eg: 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作: 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

    基于深度學習的圖像分類:使用ShuffleNet實現高效分類

    前言 圖像分類是計算機視覺領域中的一個基礎任務,其目標是將輸入的圖像分配到預定義的類別中。近年來,深度學習技術,尤其是卷積神經網絡(CNN),在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…

    OpenGL里相機的運動控制

    相機的核心構造一個是glm::lookAt函數,一個是glm::perspective函數,本文相機的一切運動都在于如何構建相應的參數傳入上述兩個函數里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相機所在位置glm::vec3 const &center,//要凝視的點glm::vec…

    java設計模式 -【策略模式】

    策略模式定義 策略模式(Strategy Pattern)是一種行為設計模式,允許在運行時選擇算法的行為。它將算法封裝成獨立的類,使得它們可以相互替換,而不影響客戶端代碼。 核心組成 Context(上下文)&…

    項目重新發布更新緩存問題,Nginx清除緩存更新網頁

    server {listen 80;server_name your.domain.com; # 替換為你的域名root /usr/share/nginx/html; # 替換為你的項目根目錄# 規則1:HTML 文件 - 永不緩存# 這是最關鍵的一步,確保瀏覽器總是獲取最新的入口文件。location /index.html {add_header Cache-…

    系統架構師:系統安全與分析-思維導圖

    系統安全與分析的定義??系統安全與分析是系統架構師在系統全生命周期中貫穿的核心職責,其本質是通過??識別、評估、防控安全風險,并基于數據與威脅情報進行動態分析??,構建從技術到管理的多層次防護體系,確保系統的保密性&a…

    利用 Google Guava 的令牌桶限流實現數據處理限流控制

    目錄 一、令牌桶限流機制原理 二、場景設計與目標 三、核心實現代碼(Java) 1. 完整代碼實現 四、運行效果分析 五、應用建議 在高吞吐數據處理場景中,如何限制數據處理速率、保護系統資源、防止下游服務過載是系統設計中重要的環節。本文…

    小黑課堂計算機二級 WPS Office題庫安裝包2.52_Win中文_計算機二級考試_安裝教程

    軟件下載 【名稱】:小黑課堂計算機二級 WPS Office題庫安裝包2.52 【大小】:584M 【語言】:簡體中文 【安裝環境】:Win10/Win11(其他系統不清楚) 【迅雷網盤下載鏈接】(務必手機注冊&#…

    CSS3知識補充

    1.偽類和偽元素: 簡單的偽類實例 :first-chlid :last-child :only-child :invalid 用戶行為偽類 :hover——上面提到過,只會在用戶將指針挪到元素上的時候才會激活,一般就是鏈接元素。:focus——只會在用戶使用鍵盤控制,選…