2009-11-24 18 views
0

继我之前的question关于(另一个)SQL查询的帮助

我有一个名为activity有2列的表格:

`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 

我想过使用UNIONLOOP,但我的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

你有没有桌子的实际布局? – Suroot 2009-11-24 03:52:14

+0

@Suriit:是的,在我之前的问题中,也加入了这里。 – Amirshk 2009-11-24 03:54:00

回答

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

简单美丽! – Amirshk 2009-11-24 04:36:11

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:你的查询每天返回唯一的GUID。但是“新用户”是在当天出现的,而不是前几天。这就是为什么我在我的问题中有复杂的查询。 – Amirshk 2009-11-24 04:14:17

+0

@Suroot,看到Am的相关问题 - 数据集在那里更清楚地表达出来。 – pilcrow 2009-11-24 04:27:38