У меня есть таблица MySQL "stats", которая представляет собой список записей для каждого входа на сайт. Каждая запись имеет строку "userId", временную метку "loginTime" и другие поля. Для каждого пользователя может быть более одной записи - для каждого входа, который он делает. Я хочу написать запрос, который будет вычислять среднее значение уникальных ежедневных логинов за, скажем, 30 дней. Любые идеи?
/* Это должно дать вам одну строку для каждой даты и уникальных посещений на эту дату */
SELECT DATE (loginTime) LoginDate, COUNT (userID) UserCount
FROM stats
ГДЕ ДАТА (loginTime) МЕЖДУ [дата начала] И [дата окончания]
GROUP BY DATE (logintime), userID
Примечание. Это будет более полезно, если вы можете предоставить некоторые примеры данных с результатом, который вы ищете.
Спасибо всем, в конце концов я использовал:
SELECT SUM (uniqueUsers
)/30 AS DAU
FROM (
SELECT DATE (loginTime
) AS DATE, COUNT (DISTINCT userID
) AS uniqueUsers
FROM user_requests
WHERE DATE (loginTime
) > DATE_SUB (CURDATE(), INTERVAL 30
ДЕНЬ)
ГРУППА ПО ДАТЕ (loginTime
)
) AS daily_users
Я использую SUM и деля на 30 вместо среднего, потому что в некоторые дни у меня может не быть логинов, и я хочу это учитывать. Но на любом ежедневном веб-сайте с интенсивным трафиком просто использование AVG даст те же результаты
Я, вероятно, ошибаюсь, но если вы это сделали: select count(distinct userid) from stats where logintime between start of :day and end of day
для day
в каждый из этих 30 дней выбрали эти 30 отсчетов (которые можно было предварительно подсчитать в кешированном виде (так как у вас, вероятно, нет пользователей, входивших в систему прошлые времена)), и они просто усредняют их на языке программирования, что выполнение запроса из
Я читаю http://unganisha.org/home/pages/Generating_Sequences_With_SQL/index.html, когда вы смотрите и думаете, если бы у вас была таблица с числами от 0 до 30, давайте назовите ее смещения для этого пример:
select avg(userstoday)
from (select count(userid) as userstoday, day
from stats join offsets on (stats.logintime=(current_day)-offsets.day)
group by day)
и, как я заметил, значение userstoday может быть предварительно рассчитано и сохранено в таблице
userID
FROMstats
WHERE DATE (loginTime
) = CURDATE ()" , который будет показывать уникальных пользователей на сегодняшний день. Я могу заменить CURDATE () на любую дату, и я могу COUNT () результаты, но я не знаю, как пройти через последние 30 дней с циклом.