我有一个查找表,其中涉及与这些日期相关的日期和人员:
id, user_id,date
1,1,2014-11-01
2,2,2014-11-01
3,1,2014-11-02
4,3,2014-11-02
5,1,2014-11-03
我可以按日期(日期)对这些进行分组:
SELECT DATE_FORMAT(
MIN(date),
'%Y/%m/%d 00:00:00 GMT-0'
) AS date,
COUNT(*) as count
FROM user_x_date
GROUP BY ROUND(UNIX_TIMESTAMP(created_at) / 43200)
但是,如何才能获得之前已经出现的独特用户数量?例如,这将是一个有效的结果:
unique, non-unique, date
2,0,2014-11-01
1,1,2014-11-02
0,1,2014-11-03
这可能不必依赖脚本语言来跟踪这些数据吗?
答案 0 :(得分:0)
我认为这个查询会做你想要的,至少它似乎适用于有限的样本数据。
我们的想法是使用相关的子查询来检查user_id是否发生在当前行日期之前的某个日期,然后执行一些基本算法来确定每个日期的唯一/非唯一用户数。
请试一试。
select
sum(u) - sum(n) as "unique",
sum(n) as "non-unique",
date
from (
select
date,
count(user_id) u,
case when exists (
select 1
from Table1 i
where i.user_id = o.user_id
and i.date < o.date
) then 1 else 0
end n
from Table1 o
group by date, user_id
) q
group by date
order by date;
我没有在示例小提琴中包含id
列,因为它不需要(或用于)产生结果并且不会改变任何内容。
答案 1 :(得分:0)
这是相关问题:&#34;但是,如何获得以前已经显示的唯一身份用户数?&#34;
计算一个人第一次出现,然后将其用于聚合:
SELECT date, count(*) as FirstVisit
FROM (SELECT user_id, MIN(date) as date
FROM user_x_date
GROUP BY user_id
) x
GROUP BY date;
然后我将其用作另一个聚合的子查询:
SELECT v.date, v.NumVisits, COALESCE(fv.FirstVisit, 0) as NumFirstVisit
FROM (SELECT date, count(*) as NumVisits
FROM user_x_date
GROUP BY date
) v LEFT JOIN
(SELECT date, count(*) as FirstVisit
FROM (SELECT user_id, MIN(date) as date
FROM user_x_date
GROUP BY user_id
) x
GROUP BY date
) fv
ON v.date = fv.date;