Прокат 30 дней уникальных в sql - PullRequest
1 голос
/ 26 мая 2011

Предположим, у вас есть таблица вида:

create table user_activity (
    user_id int not null, 
    activity_date timestamp not null, 
    ...);

Достаточно просто выбрать количество уникальных идентификаторов пользователя за последние 30 дней.

select count(distinct user_id) from user_activity where activity_date > now() - interval 30 day;

Но как вы можете выбрать количество уникальных идентификаторов пользователя за предыдущие 30 дней для каждого из последних 30 дней? Например. уникальные за 0-30 дней назад, 1-31 день назад, 2-32 дня назад и т. д. до 30-60 дней назад.

Движок базы данных - mysql, если это имеет значение

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Я не пробовал это в MySQL, но, надеюсь, синтаксис правильный.Если нет, возможно, это укажет вам правильное направление.Во-первых, я часто использую таблицу чисел.Это может быть физическая таблица, состоящая просто из чисел, или это может быть сгенерированная / виртуальная / временная таблица.

SELECT
    N.number,
    COUNT(DISTINCT UA.user_id)
FROM
    Numbers N
INNER JOIN User_Activity UA ON
    UA.activity_date >  NOW() - INTERVAL 30 + N.number DAY AND
    UA.activity_date <= NOW() - INTERVAL N.number DAY
WHERE
    N.number BETWEEN 0 AND 30
GROUP BY
    N.number

Я не знаком со всем синтаксисом INTERVAL, поэтому, если я ошибся,пожалуйста, дайте мне знать, и я постараюсь исправить это.

0 голосов
/ 26 мая 2011

Вы можете попробовать использовать подзапрос:

SELECT DISTINCT `activity_date` as `day`, (
SELECT count(DISTINCT `user_id`) FROM `user_activity` WHERE `activity_date` = `day`
) as `num_uniques`
FROM `user_activity` 
WHERE `activity_date` > NOW() - INTERVAL 30 day;

Это должно дать вам количество уникальных пользователей за каждый день. Однако я не проверял это, так как у меня нет базы данных для работы.

0 голосов
/ 26 мая 2011

Если вы получите число дней для текущей даты и измените его на 30, вы получите смещение текущего дня. Затем вы добавляете это к каждому числу для даты и делите результат на 30, это дает вам группу дней. Затем сгруппируйте результаты по этому номеру. Так в коде что-то вроде этого:

 select count(distinct user_id), (to_days(activity_date)+(to_days(now()) % 30)) / 30 as period
 from user_activity
 group by (to_days(activity_date)+(to_days(now()) % 30)) / 30

Я оставлю вычисление обратной нумерации периода до вас (подсказка: возьмите номер периода для текущей даты как «max» и вычтите период выше и добавьте 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...