日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

 

前言

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

需求分析

MySQL中只會(huì)count(),sum()?累加運(yùn)算沒聽過?

 

假如上表為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我們很容易得出以下列表:

MySQL中只會(huì)count(),sum()?累加運(yùn)算沒聽過?

 

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

MySQL中只會(huì)count(),sum()?累加運(yùn)算沒聽過?

 

這就有點(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)然有。記得很普遍的場(chǎ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)鍵字,而且賦值必須使用 := 符號(hào)。

Mysql累加計(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é)果如下,符合邏輯需要。

MySQL中只會(huì)count(),sum()?累加運(yùn)算沒聽過?

 

但是這里有一個(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ì)算的問題。

分享到:
標(biāo)簽:累加 運(yùn)算 MySQL
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定