1

我试图以每周作为不同标识的分区每天获取不同数量的用户 ID 日志。例如,如果一个用户在第 1 周的星期五/星期六和第 2 周的星期一/星期五登录,我希望有一个列在星期五计算为 1,在星期六第 1 周计算为 0,在星期一计算为 1,在星期五第 2 周计算为 0 .

如果我有以下数据:

https://i.stack.imgur.com/COf69.png

我期待这个结果:

https://i.stack.imgur.com/kTRdu.png

我与 Presto 合作,并尝试过使用 dense_rank() 解决方案,但无济于事。

4

1 回答 1

1

您可以使用窗口函数和聚合:

select date, iso_week, sum(case when rn = 1 then 1 else 0 end) cnt
from (
    select t.*, 
        row_number() over(partition by userid, iso_week order by date) min_date
    from mytable t
) t
group by date, iso_week

更好的是,使用标准where子句聚合函数,Presto 支持:

select date, iso_week, count(*) filter(where rn = 1) cnt
from (
    select t.*, 
        row_number() over(partition by userid, iso_week order by date) min_date
    from mytable t
) t
group by date, iso_week
于 2020-11-01T21:45:59.423 回答