時間相減得到天數 連續登陸人數天數問題

2021-10-13 15:58:05 字數 2193 閱讀 4571

有時候我們會碰到連續登入人數計算的問題,比如想要求下面這兩個問題的結果,該怎麼求?

最近連續登陸天數

任意時間段內連續登陸天數

最近連續登陸超過x天的人數

原始資料給你:

name表示使用者,date表示登陸的日期

最近連續登陸天數計算實現方式:

select name,count(1) as `使用者最近連續登陸天數`

from (

select name

,date

,first_value(date) over (partition by name order by date desc) as last_login_date -- 使用者最近登陸日期

,date_add(

first_value(date) over (partition by name order by date desc) -- 使用者最近登陸日期

,interval

-row_number() over (partition by name order by date desc)+1

day) date_line -- 以使用者最近登陸日期做降序排序,算出連續間隔1、2、3...n天的日期

from aaa

) t

where date = date_line -- 限制 date = date_line 得到使用者最近連續活躍日期

group by name

計算過程:

1.使用者最近登陸日期;

2.以使用者最近登陸日期做降序排序,算出連續間隔1、2、3...n天的日期,得到一列date_line欄位;

3.此時,如果我們限制date=date_line,就已經得到使用者最近連續活躍日期了;

4.使用上面的結果彙總一下,"使用者最近連續登陸天數"結果就出來了(通過此結果還能計算「最近連續登陸超過x天的人數」):

下面這個實現方式稍微複雜一些,但不僅是能計算「最近的連續登陸天數」,還能算「任意時間段的連續登陸天數」,擴充套件性更強:

實現指令碼:

with t as(

select *

,min(last_date) over (partition by name order by date desc) as date_set

from (

select name

,date

,if(datediff(lag(date) over (partition by name order by date desc),date)=1,null,date) as last_date

from aaa

) t

)select name,date_set,count(*) as `連續登陸天數`

from t

-- where date_group='2020-10-19' 最近一天登陸使用者的連續登陸天數

group by name,date_set

計算過程:

1.把同一使用者的連續登陸日期放到一塊,派生出連續登陸日期組的最後日期,作為下游統計時用的分組:

2.以使用者和「連續日期組」作分組彙總,得到使用者在該組下面的連續登陸天數(通過此結果還能計算「某段時間內連續登陸超過x天的人數」)。

C 兩個日期相減得到天數

兩個日期相減,所得結果是乙個 時間間隔 timespan,timespan型別的乙個屬性days可以表示此時間間隔對應的天數。datetime dt1 datetime.now datetime dt2 datetime.parse 2019 3 6 14 20 45 timespan ts dt1...

sql 時間相減 得到 毫秒 秒 分鐘 小時 天等

想起幾個月之前接到乙個需求,要統計伺服器對每個請求的大致處理時間。幸好對每個請求都記了日誌到資料庫。因此寫了乙個時間相減的sql。select t1.id id,t1.requrl requseturl,t1.requesttime requesttime,t1.responsetime respo...

oracle計算連續登陸 上班天數

現在有乙個計算使用者連續上班天數的報表,發現通過用row number分析函式可以完美計算這個問題。這個sql可以解決計算使用者連續登陸 簽到 上班 曠工等問題。首先將row number按照日期排序 將日期的日,比如2016 7 1,將1擷取出來轉換成數字 把這個日期數字減去row number計...