用sql解決最近連續簽到與最大連續簽到

2021-10-08 10:44:31 字數 2316 閱讀 7480

題目:有一張使用者簽到表【t_user_attendence】,標記每天使用者是否簽到(說明:該錶包含所有使用者所有工作日的出勤記錄) ,包含三個字段:日期【fdate】,使用者id【fuser_id】,使用者當天是否簽到【fis_sign_in:0否1是】

問題1:請計算截至當前每個使用者已經連續簽到的天數

select 

fuser_id

,datediff(

'20200415'

,fdate_max)

as fconsecutive_days

from

(select fuser_id

,max(fdate) fdate_max

from t_user_attendence

where fis_sign_in =

0group

by fuser_id

) t1;

問題2:請計算每個使用者歷史以來最大的連續簽到天數
select fuser_id

,max

(length(cut_fsign_record)

)as fmax_days

(select fuser_id

,fsign_record

,cut_fsign_record

from

(select fuser_id

,wm_concat(fis_sign_in) fsign_record

from t_user_attendence

group

by fuser_id

) t1

lateral view explode(split(fsign_record,

'0')

) t as cut_fsign_record

) t2

where cut_fsign_record<>

''group

by fuser_id;

最近在刷leetcode題目,有這樣一道題目:取連續數字,有一位答主用row_number就解決了(貼鏈結leetcode取連續數字),其思路是將出現的數值按自然連續排序,並把相同數值進行分組再自然連續排序,兩個排序相減得到差值t,若數值連續,則差值t相等。我按照這個思路重新想了問題2,得到了新的sql解決方案。

據此解決思路,重新碼了取最大連續天數的**。

先按人分組按天進行自然連續排序;再只取簽到部分,按人分組進行自然連續排序,相差得到差值diff1;再按照差值diff1分組計數,得到每人連續簽到的天數,求最大值即可。

select 

fuser_id,

max(ct)

as max_ct

from

(select

fuser_id

,diff1

,count

(diff1)

as ct

from

(select

*,row_number(

)over

(partition

by fuser_id order

by fdate)

as or2

,or1 - row_number(

)over

(partition

by fuser_id order

by fdate)

as diff1

from

(select

fdate

,fuser_id

,fis_sign_in

,row_number(

)over

(partition

by fuser_id order

by fdate)

as or1

from t_user_attendence

order

by fuser_id,fdate

) twhere fis_sign_in =

1) t2

group

by fuser_id,diff1

) t3

group

by fuser_id;

感謝大佬們,站在巨人的肩膀上的感覺,hhhh~~~

最大連續簽到天數 sql

select min rq as 起始日期 max rq as 終止日期 max id1 min id1 1 as 持續天數 id3 as 累計簽到天數 name from select datediff rq,2020 02 01 id1 select count 1 from tmptable ...

mysql 連續簽到天數 最大連續簽到天數 sql

select min rq as 起始日期 max rq as 終止日期 max id1 min id1 1 as 持續天數 id3 as 累計簽到天數 name from select datediff rq,2020 02 01 id1 select count 1 from tmptable ...

sql 得到連續簽到天數及總簽到天數

declare days int set days 0 declare curr day datetime 建立day用於儲存連續簽到日期set curr day getdate curr day為當前日期 while exists select null from mall membersign ...