題目:有一張使用者簽到表【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 ...