接了乙個需求,產品想分析一下使用者增長的曲線。也就是某個時間段的每日總人數列表。好對近期活動進行乙個效果的評測。這個統計sql還是花了我一小段時間的。mysql統計這個還是需要一定的技巧的。
user_id
reg_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_time
daily_quantity
2019-09-03
12019-09-04
22019-09-05
22019-09-06
1但是這個並不是我們想要的結果。我們想要的應程式設計客棧該是 上一天的總人數加上今天的淨增長數,以此類推。也就是我們想要:
reg_time
daily_quantity
2019-09-03
12019-09-04
32019-09-05
52019-09-06
6這就有點棘手了,我們需要進行累加計算。我嘗試了自鏈結,函式等一些操作後還是沒有得到乙個正確的結果。這時想到如果是j**a**處理這個就再合適不過了,我們只要宣告初始值,然後迴圈累www.cppcns.com加就能計算出結果了:
public static void main(string args) ;
int ints = dailyquantityarr(0, arr);
for (int i : ints)
} public static int dailyquantityarr(int base, int dailyincrquantity)
return result;
}上面的偽**就可以計算出結果。當然如果可以的話盡量在j**a業務**進行這種複雜運算。但是產品給出的需求是我們能夠提供一句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中使用者變數不用事前申明,使用的時候以@varname的格式進行宣告。通過:=或者=進行賦值操作。如果需要對外輸出需要用select關鍵字,而且賦值必須使用:=。
我們學習了使用者變數後www.cppcns.com就知道如何進行累加計算了,那麼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_time
daily
daily_quantity
2019-09-0311
2019-09-0423
2019-09-0525
2019-09-0616
但是這裡有乙個小坑,在實際業務中@i初始化的時候有可能不為0,比如我們統計上面9月4號到9月6號這時候之前的總人數為1 。 這個要特別注意。實際業務開發中如果我們能在邏輯編碼中實現還是建議在邏輯編碼中進行一些複雜的運算。
今天我們通過mysql使用者變數解決了乙個在sql中累加計算的問題。不知道你有沒有其它好的思路呢?歡迎留言討論。
累加計算的並行與序列效率比較
計算一幅影象的畫素值的平均值 測試環境 cpu intel r core tm i7 7700 cpu 3.60ghz x 8gpu nvidia geforce gtx 1050 1,在cuda gpu上計算累加和,先分段計算,在進行規約,分段計算裡面其實也是規約,然後除以總的畫素個數。2,在cp...
對Python實現累加函式的方法詳解
這個需求比較奇怪,要求實現sum和magasum函式,實現以下功能 sum 1 1 sum 1,2,3 6 mega程式設計客棧sum 1 1 megasum 1 2 3 6 實際上sum就是python自建的sum函式,它支援變參,變參怎麼實現,自然是 args,所以很容易寫出雛形 sumdef ...
mysql 開窗函式 累加 mysql實現開窗函式
學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount 201601 1 50...