Помощь по (другому) запросу SQL

0

Следуя предыдущему question.

У меня есть таблица с именем activity с двумя столбцами:

`when` as datetime // last time i saw a user
guid as varchar  // a unique identifier for each user

У меня есть запрос, который возвращает количество новых пользователей, которые у меня есть для заданной даты и времени:

 SET @till_date='2009-11-01'; #for today, give CURDATE()+1
 SET @duration=1; # this can be changed to 7, 31, etc
 SELECT COUNT(guid) AS total_new_users, DATE_SUB(@till_date, INTERVAL @duration DAY) AS since_date, @till_date AS till_date
 FROM `activity` WHERE 1
  AND `when` BETWEEN DATE_SUB(@till_date, INTERVAL @duration DAY) AND @till_date
  AND guid NOT IN
  (
   SELECT guid
   FROM `activity`
   WHERE `when` < DATE_SUB(@till_date, INTERVAL @duration DAY)
  )

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

Что-то вроде этого:

total_new_users  |  since_date  |  till_date
----------------------------------------------
   10            |  2009-11-20  |  2009-11-21
   10            |  2009-11-21  |  2009-11-22
   10            |  2009-11-22  |  2009-11-23

Я думал об использовании UNION с LOOP, но мои знания SQL довольно простые, помогите?


Результат (благодаря @pilcrow):

SET @till_date='2009-11-15';
SET @since_date='2009-11-01';
SELECT first AS yyyymmdd, 
   COUNT('x') AS new_user_count
FROM (SELECT guid,
             DATE(MIN(`when`)) AS first
      FROM activity
      GROUP BY 1) first_appearance
WHERE first BETWEEN @since_date AND @till_date
GROUP BY 1
  • 0
    У вас есть фактическое расположение стола?
  • 0
    @Suriit: да, был в моем предыдущем вопросе, также добавлен здесь.
Теги:

2 ответа

2
Лучший ответ

Предполагая SET SESSION sql_mode = 'ANSI_QUOTES':

SELECT first AS yyyymmdd, 
       COUNT('x') AS new_user_count
FROM (SELECT guid,
             MIN("when") AS first
      FROM activity
      GROUP BY 1) first_appearance
WHERE first BETWEEN @since_date AND @till_date
GROUP BY 1

Вы можете, конечно, заменить DATE_SUB() на @since_date, если хотите.

  • 0
    просто красиво!
0
SELECT 
    COUNT(DISTINCT guid) AS total_new_users, 
    DATE(when) AS since_date, 
    DATE(DATE_ADD(when, INTERVAL 1 DAY)) AS till_date 
FROM 
    Activity 
GROUP BY 
    DATE(when)
  • 0
    @Suroot: ваш запрос возвращает уникальных гидов в день. но «новый пользователь» идентифицируется, появляясь в тот день, а не в любой из предыдущих дней. Вот почему у меня сложный вопрос в моем вопросе.
  • 0
    @Suroot, см. Связанный вопрос Am - набор данных там более четко сформулирован.

Ещё вопросы

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