כותב הנוסחא עדכן אותה מעט אבל עדיין יש בה תקלות.
להלן הקוד
with RECURSIVE
-- שליפה זמנית: רשימת תאריכים
dates as (select '2020-09-06' as _revlog_date_ union select date(_revlog_date_,'+1 day')
from dates where _revlog_date_ < '2027-01-20' ),
-- שליפה זמנית: נתוני לוג
log as (
select
-- מזהה כרטיס
cid,
-- תאריך לוג
date(substr(id,1,10) - 7200,'unixepoch') date_log,
-- תאריך חזרה
date(substr(id,1,10) - 7200,'unixepoch') date_ans,
-- מחזיר את הפעם הבאה שהכרטיס הזה נענה
LEAD(date(substr(id,1,10),'unixepoch')) over (PARTITION by cid order by date(substr(id,1,10) - 7200,'unixepoch')) next_ans,
-- לאיזה תאריך זה תוזמן פחות יום
date(substr(id,1,10) - 7200 + (case when ivl < 0 then 0 else ivl * 86400 end),'unixepoch','-1 day') sch_from,
-- האם חדש
case when lastivl = -60 then 1 else 0 end new,
-- האם חזרה
case when lastivl <> -60 then 1 else 0 end ans,
-- האם מתוזמן
0 sch
from revlog WHERE ease != 1 AND cid in (select id from cards WHERE queue IN (2,3) )
-- עבור כל שורה מהשליפה לעיל מוסיף עוד שורת תזמון החל sch_from עד next_ans
union
select cid,
date(sch_from, '+1 day') date_log ,
date_ans,
sch_from,
next_ans,
0 new,
0 ans,
1 sch
from log
where date(sch_from, '+1 day') <= COALESCE(next_ans,CURRENT_DATE)
),
-- שליפה זמנית: כמות כרטיסים ביום
cid_rep_date as (
select date(substr(id,1,10)+ 0,'unixepoch') cid_date , count(distinct cid) cnt_cid from revlog group by date(substr(id,1,10)+ 0,'unixepoch')
)
-- עד כאן שלב ההצהרות
select unixepoch(_revlog_date_),
a ans,
n new, s sch, (a * 100 / s) p, cnt_cid from
dates left join
(
(select date_log,
sum(ans) a,
sum(sch) s,
sum(new) n
from log group by date_log) ans_sch
join cid_rep_date on ans_sch.date_log = cid_rep_date.cid_date) log_data
on dates._revlog_date_ = log_data.date_log
בקוד הזה שמתי לב לבעיה שאם יש שתי חזרות שנענו באותו יום הקוד הזה מסמן אותן רק כחזרה אחת.
(המשמעות של -7200 היא הפער ביחס לזמן GMT + פער של הזמן שבו מתחלף יום בתוכנה)