欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年05月21日 09:15:27   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了mysql累加計(jì)算實(shí)現(xiàn)方法,結(jié)合實(shí)例形勢分析了mysql累加計(jì)算原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下

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

前言

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

需求分析

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ù)時(shí)間維度統(tǒng)計(jì)出每日新增的人數(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

但是這個(gè)并不是我們想要的結(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

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

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

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

Mysql 用戶變量

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

使用Mysql用戶變量進(jìn)行累加計(jì)算

我們學(xué)習(xí)了用戶變量后就知道如何進(jìn)行累加計(jì)算了,那么user_info表的日累計(jì)總?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

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

總結(jié)

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

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

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

相關(guān)文章

  • Mysql主從延時(shí)圖解方法

    Mysql主從延時(shí)圖解方法

    我們知道,一個(gè)服務(wù)器開放N個(gè)鏈接給客戶端連接的,就會(huì)有大并發(fā)的更新操作,但是從服務(wù)器的里面讀取binlog線程得僅有一個(gè),當(dāng)某個(gè)SQL在從服務(wù)器上執(zhí)行的時(shí)間稍長?或由某個(gè)SQL要鎖表就會(huì)導(dǎo)致主服務(wù)器的SQL大量積壓,未被同步到從服務(wù)器,就導(dǎo)致了主從不一致,也就是主從延遲
    2022-01-01
  • mysql中的鎖機(jī)制深入講解

    mysql中的鎖機(jī)制深入講解

    對(duì)于任何一種數(shù)據(jù)庫來說都需要有相應(yīng)的鎖定機(jī)制,所以MySQL自然也不能例外。下面這篇文章主要給大家介紹了關(guān)于mysql中鎖機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • mysql 字符集的系統(tǒng)變量說明

    mysql 字符集的系統(tǒng)變量說明

    mysql 字符集的系統(tǒng)變量的一些說明,大家在使用過程中,可以作個(gè)參考。
    2009-07-07
  • MySQL開放遠(yuǎn)程連接權(quán)限的兩種方法

    MySQL開放遠(yuǎn)程連接權(quán)限的兩種方法

    在我們使用mysql數(shù)據(jù)庫時(shí),有時(shí)我們的程序與數(shù)據(jù)庫不在同一機(jī)器上,這時(shí)我們需要遠(yuǎn)程訪問數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于MySQL開放遠(yuǎn)程連接權(quán)限的兩種方法,需要的朋友可以參考下
    2022-06-06
  • MySQL圖形化管理工具Navicat安裝步驟

    MySQL圖形化管理工具Navicat安裝步驟

    大家好,本篇文章主要講的是MySQL圖形化管理工具Navicat安裝步驟,感興趣的同學(xué)趕快來看看吧,對(duì)你有幫助的話記得收藏一下哦
    2021-12-12
  • 解讀sql中timestamp和datetime之間的轉(zhuǎn)換

    解讀sql中timestamp和datetime之間的轉(zhuǎn)換

    這篇文章主要介紹了解讀sql中timestamp和datetime之間的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MySQL主從配置及haproxy和keepalived搭建過程解析

    MySQL主從配置及haproxy和keepalived搭建過程解析

    這篇文章主要介紹了MySQL主從配置及haproxy和keepalived搭建,本次運(yùn)行環(huán)境是在docker中,也會(huì)介紹一些docker的知識(shí),需要的朋友可以參考下
    2022-05-05
  • MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程

    MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的查詢緩存機(jī)制基本學(xué)習(xí)教程,默認(rèn)針對(duì)InnoDB存儲(chǔ)引擎下來將,需要的朋友可以參考下
    2015-11-11
  • MySQL數(shù)字的取整、四舍五入、保留n位小數(shù)方式

    MySQL數(shù)字的取整、四舍五入、保留n位小數(shù)方式

    這篇文章主要介紹了MySQL數(shù)字的取整、四舍五入、保留n位小數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mysql 出現(xiàn)故障應(yīng)用直接中斷連接導(dǎo)致數(shù)據(jù)被鎖(生產(chǎn)故障)詳解

    Mysql 出現(xiàn)故障應(yīng)用直接中斷連接導(dǎo)致數(shù)據(jù)被鎖(生產(chǎn)故障)詳解

    這篇文章主要介紹了 Mysql 出現(xiàn)故障應(yīng)用直接中斷連接導(dǎo)致數(shù)據(jù)被鎖(生產(chǎn)故障)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論