2

一周内活跃 # 天的分布:我试图找出在 3/1-3/7 的特定一周内有多少成员活跃了 1 天、2 天、3 天、…7 天。

有没有办法在分区之上使用聚合函数?如果不是,可以用什么来实现这一点?

select distinct memberID,count(date) over(partition by memberID) as no_of_days_active
from visitor
where date between '"2019-01-01 00:00:00"' and '"2019-01-07 00:00:00"'
order by no_of_days_active

结果应该是这样的

#Days Active    Count
1           20
2           32
3           678
4           34
5           3
6           678
7           2345
4

2 回答 2

0

我认为您需要两个级别的聚合来计算一周中的天数:

select num_days_active, count(*) as num_members
from (select memberID, count(distinct date::date) as num_days_active
      from visitor
      where date >= '2019-01-01'::date and 
            date < '2019-01-08'::date
      group by memberID
     ) v
group by num_days_active
order by num_days_active;

请注意,我更改了日期比较。如果您有时间组件,则between不起作用。而且,因为您在常量中包含了时间,所以我为count(distinct). date如果确实是没有时间成分的日期,那可能没有必要。

于 2019-04-22T17:39:38.153 回答
0

借鉴@Gordon 的回答,我个人喜欢with对子查询使用语句:

with dat as (
    select distinct
        memberID,
        count(date) over(partition by memberID) as no_of_days_active
    from visitor
    where 1=1
        and date between '2019-01-01'::date and '2019-01-07'::date
    order by no_of_days_active
)

select 
    no_of_days_active, 
    count(no_of_days_active) no_of_days_active_cnt
from dat
group by no_of_days_active
order by no_of_days_active
于 2019-04-22T18:13:55.380 回答