SQL一周内最大活跃天数
案例一:自然周内最大活跃天数,按“日历周(周一到周日)”统计。
思路:
①给每一天标上年 + 周号
②按 (gaid, 年, 周)统计活跃天数
③再按 gaid 取最大值
易错点:
①周号的写法
②统计活跃天数时要去重
select
gaid,
max(active_days) as max_active_days_in_week
from (
select
gaid,
year(ds) as yr,
weekofyear(ds) as wk,
count(distinct ds) as active_days
from active_log
group by gaid, year(ds), weekofyear(ds)
) t
group by gaid;
案例二:任意连续 7 天内最大活跃天数(滑动窗口)
思路:
① 以每一天作为窗口终点
对每一个 ds,看它往前 6 天 + 当天
② 统计该窗口内的活跃天数
用 count(distinct ds),避免同一天多次活跃
③ 按用户取最大值得到每个用户在任意连续 7 天内,最多活跃几天
易错点:
①窗口写错成 ROWS,range between 6 preceding按日期值
②统计活跃天数时要去重count(distinct ds)
select
gaid,
max(window_active_days) as max_active_days_last_7d
from (
select
gaid,
ds,
count(*) over (
partition by gaid
order by ds
range between 6 preceding and current row
) as window_active_days
from active_log
) t
group by gaid;
思路:
①给每一天标上年 + 周号
②按 (gaid, 年, 周)统计活跃天数
③再按 gaid 取最大值
易错点:
①周号的写法
②统计活跃天数时要去重
select
gaid,
max(active_days) as max_active_days_in_week
from (
select
gaid,
year(ds) as yr,
weekofyear(ds) as wk,
count(distinct ds) as active_days
from active_log
group by gaid, year(ds), weekofyear(ds)
) t
group by gaid;
案例二:任意连续 7 天内最大活跃天数(滑动窗口)
思路:
① 以每一天作为窗口终点
对每一个 ds,看它往前 6 天 + 当天
② 统计该窗口内的活跃天数
用 count(distinct ds),避免同一天多次活跃
③ 按用户取最大值得到每个用户在任意连续 7 天内,最多活跃几天
易错点:
①窗口写错成 ROWS,range between 6 preceding按日期值
②统计活跃天数时要去重count(distinct ds)
select
gaid,
max(window_active_days) as max_active_days_last_7d
from (
select
gaid,
ds,
count(*) over (
partition by gaid
order by ds
range between 6 preceding and current row
) as window_active_days
from active_log
) t
group by gaid;
全部评论
相关推荐
点赞 评论 收藏
分享
查看5道真题和解析