使用SQL語句得到連續天的資料

2021-10-04 13:48:37 字數 3209 閱讀 1068

使用場景:希望通過sql語句查詢得到有簽到記錄的使用者的連續簽到天數的資訊,這裡的重點是連續的天數。

第一步:如果資料庫記錄的是datetime型別,則需要先轉成date型別;如果乙個使用者一天會有多條資料,則也需要按使用者和日期進行去重複,保證乙個使用者一天只有一條資料。

select	companyid,

cast(createdate as

date

)as date1

from rec.seeinquiry

where companyid is

notnull

group

by companyid,

cast(createdate as

date

)

第二步:使用row_number進行分組與排序,按使用者進行分組,按時間進行排序

select*,

row_number (

)over

(partition

by t.companyid

order

by t.date1 asc

)as sort1

from

(select companyid,

cast(createdate as

date

)as date1

from rec.seeinquiry

where companyid is

notnull

group

by companyid,

cast(createdate as

date))

as t

得到的結果集如下圖

第三步:通過使用日期 - sort1,就會得到另乙個日期,如果有連續的簽到資料,則相減後的值也是相同的,通過這個值進行分組,求乙個count,**中的min與max只是為了驗證資料是否正確。

例如,日期為2020-02-05,sort為1,那麼相減得到2020-02-04

日期為2020-02-06,sort為2,那麼相減得到2020-02-04 …依次類推

select	t2.companyid,

dateadd(

day,

-t2.sort1, t2.date1)

as groupinfo,

--分組用

min(t2.date1)

as start_date1,

max(t2.date1)

as end_date1,

count(1

)as continous_days --連續的天數

第四步:最後對連續的天數按每個使用者進行求max,就能得到每乙個使用者最大的連續簽到資料。在此之後,如果想有其它的錶連操作,看情況連表就可以了。

總結:此**主要思路

1、利用row_number的partition by 對資料進行分組與排序;

2、利用日期-排序,如果得到的結果還是同一天,則說明是連續;

通過sql語句得到資料字典(zz)

select 表名 case when a.colorder 1 then d.name else end,字段序號 a.colorder,欄位名 a.name,標識 case when columnproperty a.id,a.name,isidentity 1 then else end,主鍵...

SQL查詢語句求出使用者的連續登陸天數

求解使用者登陸資訊表中,每個使用者連續登陸平台的天數,連續登陸基礎為彙總日期必須登陸,表中每天只有一條使用者登陸資料 計算中不涉及天內去重 表描述 user id 使用者的id sigin date 使用者的登陸日期。注 求解過程有多種方式,下述求解解法為筆者思路,其他解法可在評論區交流。思路 該問...

使用sql語句,根據年月日得到日期列

年 月 日,前提是tab這張表中有observedate 日期 nian 年 yue 月 ri 日 列 update tab set observedate convert datetime,convert char 5 nian convert char 5 yue convert char 5 ...