我有一个名为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)
);
答案 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))
应该这样做。