sql技巧(三)在線時長|最大連續登陸天數|登錄時間間隔

1.在線時長

正常的游戲有登錄和登出但是我們想計算下在線時長,這就涉及到根據登陸表的登錄時間查找登出時間的問題,基本的原理是登陸表和登出表進行匹配,查找離一條登錄記錄最近的登出時間即min(登出-登錄)>0


在線時長

2.最大連續登陸天數

游戲登錄表記錄的是游戲,用戶登陸的記錄,有些時候我們需要統計用戶的最大連續登陸天數,這就面臨一個棘手的問題,如何判斷是否連續,19日前面是18日的話是連續的,19日前面是17日的話就是不連續的,我們需要定義一個變量來存儲,開始的日期,還有...........

先看下結果


最大連續登陸天數


計算登錄時間間隔

SET @num:=0; #開始日期

SET? ? @type:="";? # 存放useid

SET @lastdate:="2018-01-01";

SET? @b=0;

? SELECT? ? userid

? ? ? ? ? ,logdate

? ? ? ? ? ,@lastdate,

? ? ? ? ? ? @b:=IF(@type=userid ,DATEDIFF(logdate,@lastdate),0) as? num2

? ? ? ? ? ,@type:=userid?

? ? ? ? ? ,@lastdate:=logdate

FROM

(

SELECT? id as userid ,date(date ) as logdate

FROM? 20180704rolelogin

GROUP BY? ? id ,date(date )

) as a ;

3.計算連續天數和累計付費金額


原始數據?


需要得到的結果

第一步,得到每一個連續日期的最早開始日期,有點繞口 直接看圖


得到連續的日期

第二部,對中間的結果進行匯總統計


得到最終結果

代碼解讀:


代碼解讀

可用代碼:

SET @a:='2018-05-03' , @b:='',@c:=0; #定義臨時變量

SELECT? name ,a? as startdate,MAX(date) as enddate,sum(pay) as money

? FROM

? ? #核心部分

(SELECT? name,@a:=IF((DATEDIFF(date,@a)=@c)and(@b=name),@a,date) as a ,

? ? ? ? ? ? ? ? ? ? ? ? #如果日期連續就保持不變,否則重置為當前日期

? ? ? ? ? ? ? date,pay,@b:=NAME #作為輔助列區分不同的name

? ? ? ? ? ? ? ,@c:=DATEDIFF(date,@a)+1 #日期差加1作為,下一個日期的判斷標準

FROM? xiaozhan as? a ) as a

GROUP BY? name,a

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,186評論 6 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,573評論 25 708
  • 今天參加了一次特別開心的會議,雖然只有十幾個人,但是每個人都特別熱情。由于地點比較遠,我到的時候已經遲到半小時了,...
    淋雨曬太陽閱讀 135評論 0 0
  • 反正理性 也不是什么了不得的玩意。 01 憋了好幾天雨,今天終于放了晴。早上特別想騎自行車上班。因為出門已經有點晚...
    雪梨和雪柔閱讀 528評論 0 2
  • 緊趕慢趕,到了南昌,十點多,南昌在下雨,細雨紛紛,更有春天的感覺。也不知道什么時候開始,我喜歡上這種飄雨的天氣,果...
    洛壹閱讀 555評論 1 0