一周内不同的日期计数

Posted

技术标签:

【中文标题】一周内不同的日期计数【英文标题】:Date distinct count over week 【发布时间】:2021-02-14 14:57:59 【问题描述】:

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

如果我有以下数据:

我期待这个结果:

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

【问题讨论】:

【参考方案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

更好的是,使用 Presto 支持的标准 where clause to aggregate functions:

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

【讨论】:

是的!这正是我所需要的,非常感谢您 请注意,Presto 支持过滤聚合 (prestosql.io/docs/current/functions/…),因此您可以这样做:count(*) FILTER (WHERE rn = 1) AS cnt @PiotrFindeisen:感谢您提供的信息,我确实不知道。为 Presto +1!

以上是关于一周内不同的日期计数的主要内容,如果未能解决你的问题,请参考以下文章

“一年中的一周”算法需要改进

从一年中的一周开始的日期返回日期不在一周内

Angularjs如何获得一周内的所有日期和日期

Rails has_many 关联计数子行

mysql中怎么查询一周内,三个月内,半年内的数据?

如何从 Prometheus 获得上周的“UP”指标计数 = 0?