Помощь по запросу SQL

0

У меня есть таблица с именем 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)
    );
  • 0
    Требуется ли количество новых зарегистрированных пользователей за последнюю неделю или количество всех пользователей, которые были просмотрены за последнюю неделю.
  • 0
    @Mark: только новые пользователи.
Теги:

5 ответов

4
Лучший ответ
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})
2

Я думаю, что вы хотите:

select count(*) from (
  select guid,min(when) as first from activity group by guid 
  having first between curdate()-interval 7 day and curdate() )

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

  • 0
    @Jim: интересный подход! добавить таблицу хотя
  • 0
    Я думаю, что мой MySQL слишком старый, он не может использовать ключевое слово DAYS . (вер. 4.1.22).
Показать ещё 3 комментария
1
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 дней на то, как долго.

  • 1
    Это будет не только считать новых пользователей, я думаю ...
  • 0
    Я думаю, что @curtisk имеет правильный ответ.
Показать ещё 1 комментарий
0
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))

Это должно сделать это.

0

Нужно прояснить. Если когда не создано заполнение, просто выберите SELECT * FROM activity WHERE, когда IS null. Но я не уверен, что это значит.

  • 0
    @flex: я обновил, надеюсь, теперь все прояснилось

Ещё вопросы

Сообщество Overcoder
Наверх
Меню