正规的连续天计算,应该排序:
WITH a AS (
SELECT DISTINCT device_id
, date
, row_number() OVER (PARTITION BY device_id ORDER BY date) rn
FROM question_practice_detail
GROUP BY device_id, date -- 一个用户一天可能登录多次,所以按device_id,date去重
),b AS ( SELECT device_id user_id
, count(*) days_count
-- ,date -- 测试使用
,date_add(a.date, INTERVAL -rn DAY) BEGIN_day -- 每个连续的第一天
-- 排序得到的序列号,如果减去后得到的结果是同一天,则说明是连续的;否则是不连续的。
FROM a
GROUP BY user_id, BEGIN_day )
SELECT
# count(if(b.days_count > 1, 1, NULL)) -- 每个连续的第一天,有几个(按device_id)连续就有几个第一天
# , sum(if(b.days_count > 1, days_count, NULL)) -- 所有总的连续天(所有device_id),包含当天
# ,sum(days_count) --所有天
# , -- 所有总的连续天减去(-)每个连续的第一天,第二天登录的
(sum(if(b.days_count > 1, days_count, NULL))-count(if(b.days_count > 1, 1, NULL)))/sum(days_count) avg_ret
FROM b