主頁 > 知識庫 > mysql累加計算實現(xiàn)方法詳解

mysql累加計算實現(xiàn)方法詳解

熱門標(biāo)簽:機器人打電銷電話 博樂電銷機器人 鄭州網(wǎng)絡(luò)外呼系統(tǒng)價錢 云南大數(shù)據(jù)外呼系統(tǒng) 電話機器人是電腦呼號嗎 南寧外呼系統(tǒng)招商 怎么更改高德地圖標(biāo)注 400電話到哪辦理優(yōu)惠 上海市三維地圖標(biāo)注

本文實例講述了mysql累加計算。分享給大家供大家參考,具體如下:

前言

接了一個需求,產(chǎn)品想分析一下用戶增長的曲線。也就是某個時間段的每日總?cè)藬?shù)列表。好對近期活動進行一個效果的評測。這個統(tǒng)計sql還是花了我一小段時間的。mysql統(tǒng)計這個還是需要一定的技巧的。

需求分析

user_id reg_time
1 2019-09-03
2 2019-09-04
3 2019-09-04
4 2019-09-05
5 2019-09-05
6 2019-09-06

假如上表user_info,我們很容易根據(jù)時間維度統(tǒng)計出每日新增的人數(shù)。sql如下:

select reg_time, count(user_id) daily_quantity
 from user_info
group by reg_time 

通過上面的sql我們很容易得出以下列表:

reg_time daily_quantity
2019-09-03 1
2019-09-04 2
2019-09-05 2
2019-09-06 1

但是這個并不是我們想要的結(jié)果。我們想要的應(yīng)該是 上一天的總?cè)藬?shù)加上今天的凈增長數(shù),以此類推。也就是我們想要:

reg_time daily_quantity
2019-09-03 1
2019-09-04 3
2019-09-05 5
2019-09-06 6

這就有點棘手了,我們需要進行累加計算。我嘗試了自鏈接,函數(shù)等一些操作后還是沒有得到一個正確的結(jié)果。這時想到如果是java代碼處理這個就再合適不過了,我們只要聲明初始值,然后循環(huán)累加就能計算出結(jié)果了:


 public static void main(String[] args) {
  int[] arr = {1, 2, 2, 1};

  int[] ints = dailyQuantityArr(0, arr);


  for (int i : ints) {
   System.out.println("i = " + i);
  }


 }


 public static int[] dailyQuantityArr(int base, int[] dailyIncrQuantity) {


  int[] result = new int[dailyIncrQuantity.length];
  // 累加填充
  for (int i = 0; i  dailyIncrQuantity.length; i++) {
   base += dailyIncrQuantity[i];

   result[i] = base;

  }
  return result;
 }

上面的偽代碼就可以計算出結(jié)果。當(dāng)然如果可以的話盡量在java業(yè)務(wù)代碼進行這種復(fù)雜運算。但是產(chǎn)品給出的需求是我們能夠提供一句sql能夠直接在可視化數(shù)據(jù)引擎中得出他要的答案。于是從上面的代碼得出靈感。
mysql是否有這種變量呢? 有!當(dāng)然有。記得很普遍的場景,以前經(jīng)常有業(yè)務(wù)需要我們輸出序號,Oracle是自帶一個偽列rownum,但是mysql沒有。mysql通常通過聲明自增變量來生成序號。拿user_info表舉例子:

select (@i:=@i+1) as rownum, user_id 
 from user_info ,(select @i:=0) as r

Mysql 用戶變量

mysql 變量分為 局部變量、用戶變量、會話變量、全局變量 。上面的語句我們使用的是用戶變量。用戶變量與數(shù)據(jù)庫連接有關(guān),在連接中聲明的變量,在存儲過程中創(chuàng)建了用戶變量后一直到數(shù)據(jù)庫實例接斷開的時候,變量就會消失。在此連接中聲明的變量無法在另一連接中使用。
MySQL中用戶變量不用事前申明,使用的時候以@varname的格式進行聲明。通過:=或者=進行賦值操作。如果需要對外輸出需要用select關(guān)鍵字,而且賦值必須使用:=

使用Mysql用戶變量進行累加計算

我們學(xué)習(xí)了用戶變量后就知道如何進行累加計算了,那么user_info表的日累計總?cè)藬?shù)應(yīng)該是這樣的:

 
 select a.reg_time,
    a.daily,
   @i:=@i+a.daily as daily_quantity 
  from (select reg_time ,  
  count(user_id) daily 
  from user group by reg_time ) a ,
  (select @i:=0) b

查詢的結(jié)果如下,符合邏輯需要。

reg_time daily daily_quantity
2019-09-03 1 1
2019-09-04 2 3
2019-09-05 2 5
2019-09-06 1 6

但是這里有一個小坑,在實際業(yè)務(wù)中@i初始化的時候有可能不為0,比如我們統(tǒng)計上面9月4號到9月6號這時候之前的總?cè)藬?shù)為1 。 這個要特別注意。實際業(yè)務(wù)開發(fā)中如果我們能在邏輯編碼中實現(xiàn)還是建議在邏輯編碼中進行一些復(fù)雜的運算。

總結(jié)

今天我們通過mysql用戶變量解決了一個在sql中累加計算的問題。不知道你有沒有其它好的思路呢?歡迎留言討論。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

您可能感興趣的文章:
  • mysql計算時間差函數(shù)
  • Mysql中通過生日計算年齡的多種方法
  • 在php和MySql中計算時間差的方法
  • mysql 字符串長度計算實現(xiàn)代碼(gb2312+utf8)
  • Mysql數(shù)據(jù)庫的QPS和TPS的意義和計算方法
  • MySQL幾點重要的性能指標(biāo)計算和優(yōu)化方法總結(jié)
  • 淺談mysql explain中key_len的計算方法
  • MySQL的查詢計劃中ken_len的值計算方法
  • mysql日期和時間的間隔計算實例分析
  • MySQL日期加減函數(shù)詳解
  • mysql 觸發(fā)器創(chuàng)建與使用方法示例
  • MySQL觸發(fā)器基本用法詳解【創(chuàng)建、查看、刪除等】

標(biāo)簽:恩施 益陽 寧夏 定西 澳門 白銀 杭州 秦皇島

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql累加計算實現(xiàn)方法詳解》,本文關(guān)鍵詞  mysql,累加,計算,實現(xiàn),方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql累加計算實現(xiàn)方法詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql累加計算實現(xiàn)方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章