哦,我明白了。假设您的意思是用户的签入间隔天数——而用户可能没有签入时间——那么只需使用聚合和窗口功能:
select sum( (ci.date = ci.min_date)::numeric ) / u.num_users as day_0,
sum( (ci.date = ci.min_date + interval '1 day')::numeric ) / u.num_users as day_1,
sum( (ci.date = ci.min_date + interval '2 day')::numeric ) / u.num_users as day_2
from (select u.*, count(*) over () as num_users
from users u
) u left join
(select ci.user_id, ci.date::date as date,
min(min(date::date)) over (partition by user_id order by date) as min_date
from checkins ci
group by user_id, ci.date::date
) ci;
请注意,这会聚合
checkins
按用户id和日期列出的表。这样可以确保每个日期只有一行。