中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql如何實現累加計算

發布時間:2020-07-23 09:43:39 來源:億速云 閱讀:331 作者:小豬 欄目:MySQL數據庫

小編這次要給大家分享的是mysql如何實現累加計算,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

前言

接了一個需求,產品想分析一下用戶增長的曲線。也就是某個時間段的每日總人數列表。好對近期活動進行一個效果的評測。這個統計sql還是花了我一小段時間的。mysql統計這個還是需要一定的技巧的。

需求分析

user_idreg_time
12019-09-03
22019-09-04
32019-09-04
42019-09-05
52019-09-05
62019-09-06

假如上表user_info,我們很容易根據時間維度統計出每日新增的人數。sql如下:

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

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

reg_timedaily_quantity
2019-09-031
2019-09-042
2019-09-052
2019-09-061

但是這個并不是我們想要的結果。我們想要的應該是 上一天的總人數加上今天的凈增長數,以此類推。也就是我們想要:

reg_timedaily_quantity
2019-09-031
2019-09-043
2019-09-055
2019-09-066

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

 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;
 }

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

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

Mysql 用戶變量

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

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

我們學習了用戶變量后就知道如何進行累加計算了,那么user_info表的日累計總人數應該是這樣的:

 
 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

查詢的結果如下,符合邏輯需要。

reg_timedailydaily_quantity
2019-09-0311
2019-09-0423
2019-09-0525
2019-09-0616

但是這里有一個小坑,在實際業務中@i初始化的時候有可能不為0,比如我們統計上面9月4號到9月6號這時候之前的總人數為1 。 這個要特別注意。實際業務開發中如果我們能在邏輯編碼中實現還是建議在邏輯編碼中進行一些復雜的運算。

看完這篇關于mysql如何實現累加計算的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖江市| 和顺县| 贵溪市| 丹棱县| 保康县| 永昌县| 禹州市| 金乡县| 平果县| 内江市| 都昌县| 稷山县| 上林县| 莒南县| 静乐县| 资源县| 阿巴嘎旗| 白河县| 南岸区| 七台河市| 阿图什市| 宜都市| 托克逊县| 夏邑县| 信宜市| 巍山| 淮安市| 沅江市| 南木林县| 晋中市| 都安| 金秀| 玛多县| 文安县| 镇江市| 清苑县| 凯里市| 双桥区| 上犹县| 青海省| 蓬莱市|