mysql累積聚合原理與用法實例分析
本文實例講述了mysql累積聚合原理與用法。分享給大家供大家參考,具體如下:
累積聚合為聚合從序列內(nèi)第一個元素到當前元素的數(shù)據(jù),如為每個員工返回每月開始到現(xiàn)在累積的訂單數(shù)量和平均訂單數(shù)量
行號問題有兩個解決方案,分別是為使用子查詢和使用連接。子查詢的方法通常比較直觀,可讀性強。但是在要求進行聚合時,子查詢需要為每個聚合掃描一次數(shù)據(jù),而連接方法通常只需要掃描一次就可以得到結果。下面的查詢使用連接來得到結果
SELECT a.empid, a.ordermonth,a.qty AS thismonth, SUM(b.qty) AS total, CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg FROM emporders a INNER JOIN emporders b ON a.empid=b.empid AND b.ordermonth <= a.ordermonth GROUP BY a.empid,a.ordermonth,a.qty ORDER BY a.empid,a.ordermonth
如果只是查詢2015年的累積訂單,可以加上以where條件
WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015'
運行結果如下

此外可能還需要篩選數(shù)據(jù),例如只需要返回每個員工到達某一目標之前每月訂單的情況。這里假設統(tǒng)計每個員工的合計訂單數(shù)量達到1000之前的累積情況。
這里可以使用HAVING過濾器來完成查詢
SELECT a.empid, a.ordermonth,a.qty AS thismonth, SUM(b.qty) AS total, CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg FROM emporders a INNER JOIN emporders b ON a.empid=b.empid AND b.ordermonth <= a.ordermonth WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015' GROUP BY a.empid,a.ordermonth,a.qty HAVING total<1000 ORDER BY a.empid,a.ordermonth
這里并沒有統(tǒng)計到達到1000時該月的情況,如果要進行統(tǒng)計,則情況又有點復雜。如果指定了total <= 1000,則只有該月訂單數(shù)量正好為1000才進行統(tǒng)計,否則不會對該月進行統(tǒng)計。因此這個問題的過濾,可以從另外一個方面來考慮。當累積累積訂單小于1000時,累積訂單與上個月的訂單之差是小于1000的,同時也能對第一個訂單數(shù)量超過1000的月份進行統(tǒng)計。故該解決方案的SQL語句如下
SELECT a.empid, a.ordermonth,a.qty AS thismonth, SUM(b.qty) AS total, CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg FROM emporders a INNER JOIN emporders b ON a.empid=b.empid AND b.ordermonth <= a.ordermonth WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015' GROUP BY a.empid,a.ordermonth,a.qty HAVING total-a.qty < 1000 ORDER BY a.empid,a.ordermonth
運行結果如下

如果只想返回達到累積訂單數(shù)為1000的當月數(shù)據(jù),不返回之前的月份,則可以對上述SQL語句
進一步過濾,再添加累積訂單數(shù)量大于等于1000的條件。該問題的SQL語句如下,
SELECT a.empid, a.ordermonth,a.qty AS thismonth, SUM(b.qty) AS total, CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg FROM emporders a INNER JOIN emporders b ON a.empid=b.empid AND b.ordermonth <= a.ordermonth WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015' GROUP BY a.empid,a.ordermonth,a.qty HAVING total-a.qty < 1000 AND total >= 1000 ORDER BY a.empid,a.ordermonth
運行結果如下

更多關于MySQL相關內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
相關文章
MYSQL必知必會讀書筆記第三章之顯示數(shù)據(jù)庫
MySQL是一種開放源代碼的關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫系統(tǒng)使用最常用的數(shù)據(jù)庫管理語言--結構化查詢語言(SQL)進行數(shù)據(jù)庫管理。接下來通過本文給大家介紹MYSQL必知必會讀書筆記第三章之顯示數(shù)據(jù)庫,感興趣的朋友參考下吧2016-05-05
詳解Mysql如何實現(xiàn)數(shù)據(jù)同步到Elasticsearch
要通過Elasticsearch實現(xiàn)數(shù)據(jù)檢索,首先要將Mysql中的數(shù)據(jù)導入Elasticsearch,并實現(xiàn)數(shù)據(jù)源與Elasticsearch數(shù)據(jù)同步,這里使用的數(shù)據(jù)源是Mysql數(shù)據(jù)庫。目前Mysql與Elasticsearch常用的同步機制大多是基于插件實現(xiàn)的,希望這篇文章能對大家有所幫助2021-11-11
MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖
這篇文章主要為大家介紹了MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
MySQL 數(shù)據(jù)庫約束、聚合查詢和聯(lián)合查詢使用案例
這篇文章主要介紹了MySQL 數(shù)據(jù)庫約束、聚合查詢和聯(lián)合查詢使用案例,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-08-08

