#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
GROUP BY
ваша дата и подсчет пользователей- Поскольку вы не хотите подсчитывать ВСЕ обращения пользователей, а только один доступ для каждого пользователя и дня, вам необходимо добавить
DISTINCT
- Это оконная функция. Этот объединяет все подсчеты, которые ранее выполнялись кумулятивно.
Если вы хотите получить уникального пользователя за ВСЕ дни (считать пользователя только при первом доступе), вы можете сначала отфильтровать пользователей с DISTINCT ON
помощью предложения:
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