SQL——按照季度,固定時間段,分組統計數據

来源:http://www.cnblogs.com/Caucasian/archive/2017/11/05/7790024.html
-Advertisement-
Play Games

最近在工作中接到了一個需求,要求統計當月以10天為一個周期,每個周期的數據彙總信息。假設有一張表如下: 表table_test中 ID AMOUNT CREATE_DATE 1 50 2017-01-01 2 50 2017-01-09 3 50 2017-01-11 4 50 2017-01-19 ...


  最近在工作中接到了一個需求,要求統計當月以10天為一個周期,每個周期的數據彙總信息。假設有一張表如下:

表table_test中

ID           AMOUNT         CREATE_DATE

1            50                     2017-01-01

2            50                     2017-01-09

3            50                     2017-01-11

4            50                     2017-01-19

5            50                     2017-01-21

6            50                     2017-01-22

7            50                     2017-01-24

  相當於以CREATE_DATE為組條件,1 - 10,11 -20,21 - 月末,每一個時間段的AMOUNT欄位的和。面對這個需求,首先想到的解決方案為以日期作為參數。使用代碼傳參重覆調用,發現該方法效率極低,後來做出相應優化,使用 UNION ALL 去調用 sql如下

1 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 
2 WHERE CREATE_DATE BETWEEN '2017-01-01' AND '2017-01-10'
3 UNION ALL
4 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 
5 WHERE CREATE_DATE BETWEEN '2017-01-11' AND '2017-01-20'
6 UNION ALL
7 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 
8 WHERE CREATE_DATE BETWEEN '2017-01-21' AND '2017-01-30'

  後來數據量大了後發現,效率有些跟不上。就想到了代替的優化SQL如下

1 SELECT
2     sum(amount) totalAmount,
3     floor((day(CREATE_DATE) - day(NOW()))/10) AS TIMESAPN
4 FROM
5     table_test
6 where MONTH(create_date) = MONTH(now())
7 GROUP BY
8     TIMESAPN --該sql為mysql語句,如果為其他資料庫可替換為其他資料庫函數

  關鍵點在於:

floor((day(CREATE_DATE) - day(NOW()))/10) AS TIMESAPN
當 TIMESAPN 為 0 時則在第一個周期,為1則在第二個周期,以此類推,最後在以該欄位為分組條件。完美解決效率問題。可以適當的想一下如果該需求改成按照季度統計。只需要截取日期的月份/4則可以完美解決。也就是說這個sql
基本可以解決按照一段時間去統計的大部分需求。(該sql為博主自己想出來的,適用於本需求。如果有什麼更好的解決方法可以留言。互相學習)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • --場景1: A B a 1 a 2 a 3 b 1 b 2 b 3 希望實現如下效果: a 1,2,3 b 4,5 create table tmp as select 'a' A, 1 B from dual union all select 'a' A, 2 B from dual union... ...
  • 安裝Redis 下載redis安裝包http://download.redis.io/redis-stable.tar.gz 解壓安裝包tar xzf redis-stable.tar.gz 安裝cd redis-stable/srcmake 或者直接從網上下載redis的壓縮包,然後解壓,再用ma ...
  • Redis的7個應用場景 一:緩存——熱數據 熱點數據(經常會被查詢,但是不經常被修改或者刪除的數據),首選是使用redis緩存,畢竟強大到冒泡的QPS和極強的穩定性不是所有類似工具都有的,而且相比於memcached還提供了豐富的數據類型可以使用,另外,記憶體中的數據也提供了AOF和RDB等持久化機 ...
  • db.getCollection('product').update({status:"offline"},{$set:{status:"online"}},false,true) update更新,把所有status為offline的都改為online,註意加引號 db.collection.up... ...
  • MySQL資料庫的性能的影響分析及其優化 MySQL資料庫的性能的影響 一. 伺服器的硬體的限制 二. 伺服器所使用的操作系統 三. 伺服器的所配置的參數設置不同 四. 資料庫存儲引擎的選擇 五. 資料庫的參數配置的不同 六. (重點)資料庫的結構的設計和SQL語句 1). 伺服器的配置和設置(cp ...
  • 避免自己遺忘,在這裡做個筆記: SET XACT_ABORT ON:強制事務回滾,如果不加這句的話事務有可能回滾失敗。 ...
  • 先看一下Redis是一個什麼東西。官方簡介解釋到:Redis是一個基於BSD開源的項目,是一個把結構化的數據放在記憶體中的一個存儲系統,你可以把它作為資料庫,緩存和消息中間件來使用。同時支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglo ...
  • create database test default charset utf8 collate utf8_general_ci; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...