Считать отдельный цикл в sql

#postgresql

#postgresql

Вопрос:

Я пытаюсь получить уникальных активных пользователей до даты.

Итак, в частности, у меня есть диапазон дат (скажем, август — ноябрь), где я хочу знать совокупное количество уникальных активных пользователей в день или раньше в течение месяца.

Итак, псевдокод будет выглядеть примерно так:

ВЫБЕРИТЕ КОЛИЧЕСТВО (ОТДЕЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ) ИЗ USER_DB

ГДЕ месяц = [цикл через месяцы 8-11] И ДЕНЬ <= [день в цикле 1:31]


Желаемый результат выглядит примерно так

введите описание изображения здесь

Ответ №1:

пошаговая демонстрация: db<>скрипка

 SELECT 
    mydate,
    SUM(                           -- 3
        COUNT(DISTINCT username)   -- 1, 2
    ) OVER (ORDER BY mydate)       -- 3
FROM t
GROUP BY mydate                    -- 2
  
  1. GROUP BY ваша дата и подсчет пользователей
  2. Поскольку вы не хотите подсчитывать ВСЕ обращения пользователей, а только один доступ для каждого пользователя и дня, вам необходимо добавить DISTINCT
  3. Это оконная функция. Этот объединяет все подсчеты, которые ранее выполнялись кумулятивно.

Если вы хотите получить уникального пользователя за ВСЕ дни (считать пользователя только при первом доступе), вы можете сначала отфильтровать пользователей с DISTINCT ON помощью предложения:

демонстрация: db<>скрипка

 SELECT DISTINCT ON (username)
    *
FROM t
ORDER BY username, mydate
  

Это дает:

 SELECT 
   mydate,
   SUM(
       COUNT(*)
   ) OVER (ORDER BY mydate)
FROM (
    SELECT DISTINCT ON (username)
        *
    FROM t
    ORDER BY username, mydate
) s
GROUP BY mydate