как узнать количество активных пользователей, скажем, 1 день, 2 дня, 3 дня ..... postgreSQL - PullRequest
2 голосов
/ 22 апреля 2019

Распределение # дней, активных в течение недели: я пытаюсь определить, сколько участников активны в течение 1 дня, 2 дней, 3 дней,… 7 дней в течение конкретной недели 3 / 1-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

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

В сочетании с ответом @ Гордона, мне лично нравится использовать оператор 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
0 голосов
/ 22 апреля 2019

Я думаю, вы хотите, чтобы два уровня агрегации подсчитывали количество дней в неделе:

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 действительно дата без компонента времени.

...