有关SQL查询的帮助

时间:2009-11-23 21:43:25

标签: sql mysql

我有一个名为activity的表,有两列:

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

此表用于跟踪特定资源中的使用情况。 Guid由客户创建。

我希望能够查询我在最后一天/周/月内有多少新用户。 第一次出现在活动表中的guid标识了新用户。

如何在单个SQL语句中执行此操作?

更新: 该表包含每次用户使用资源时的条目。所以如果他用了5次,就会有5行。 在用户使用该资源之前,我没有他的guid,并且表中没有任何条目供他使用。

结果

谢谢大家,它帮了很多忙。对于任何有兴趣的人,这是我根据你的所有建议编写的:

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)
    );

5 个答案:

答案 0 :(得分: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})

答案 1 :(得分:2)

我认为你想要的是:

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

您必须查询整个表格,否则在相关时间段内首次访问时,人们将被视为新的。此查询查找第一次看到每个guid,然后筛选出那些不在句点中的guid。

答案 2 :(得分: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天改为多久。

答案 3 :(得分:0)

需要克制。如果在创建时未填充when,那么当IS为null时,只需SELECT * FROM活动WHERE。但我不确定这是不是你的意思。

答案 4 :(得分: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))

应该这样做。