У меня есть таблица с именем activity
с двумя столбцами:
when as datetime // last time i saw a user
guid as varchar // a unique identifier for each user
Эти таблицы используются для отслеживания использования в определенном ресурсе. Guid создаются клиентами.
Я хочу иметь возможность запрашивать, сколько новых пользователей у меня есть в последний день/неделю/месяц.
Новый пользователь идентифицируется с помощью guid
, отображаемого в таблице действий в первый раз.
Как я могу сделать это в одном выражении SQL?
обновление: Таблица содержит запись для каждого использования пользователем ресурса. Поэтому, если он использовал 5 раз, будет 5 строк. Пока пользователь не использует ресурс, у меня нет его указателя, и для него нет записи в таблице.
Результат:
Спасибо всем, это очень помогло. Для всех, кого это интересует, это то, что я собрал из всех ваших предложений:
SET @duration=7;
SELECT COUNT(distinct guid) AS total_new_users FROM `activity`
WHERE `when` >= DATE_SUB(CURDATE(),INTERVAL @duration DAY) AND guid NOT IN
(
SELECT guid
FROM `activity`
WHERE `when` < DATE_SUB(CURDATE(),INTERVAL @duration DAY)
);
select count(guid)as total_new_users
from activity
where when >= {last day/week/month}
and guid not in(select guid
from activity
where when < {last day/week/month})
Я думаю, что вы хотите:
select count(*) from (
select guid,min(when) as first from activity group by guid
having first between curdate()-interval 7 day and curdate() )
Вы должны запросить всю таблицу, потому что иначе люди будут считаться новыми для своего первого посещения в течение рассматриваемого периода времени. Этот запрос находит первый раз, когда отображается каждый указатель, а затем отфильтровывает те, которые не находятся в периоде.
DAYS
. (вер. 4.1.22).
SELECT COUNT(DISTINCT guid)
FROM activity
WHERE guid NOT IN (
SELECT DISTINCT guid FROM activity WHERE when < CURDATE() - INTERVAL 7 DAYS
)
AND when BETWEEN CURDATE() AND CURDATE() - INTERVAL 7 DAYS;
измените 7 дней на то, как долго.
SELECT COUNT(DISTINCT guid)
FROM ACTIVITY
WHERE when BETWEEN CURDATE() AND CURDATE() - INTERVAL 7 DAYS
AND guid NOT IN (SELECT distinct GUID FROM ACTIVITY WHERE when < (CURDATE() -7 DAYS))
Это должно сделать это.
Нужно прояснить. Если когда не создано заполнение, просто выберите SELECT * FROM activity WHERE, когда IS null. Но я не уверен, что это значит.