2015-04-06 96 views
0

我有一个包含user_id和visited_at列的访问表。我想在本月找到有多少新客户和回头客。查询 - 在MySQL中查找新的和重复的用户

user_id  visited_at     

-------------------------------------------------------------------------- 

1750  2015-04-06 10:39:20 
1870  2015-04-05 15:48:11 
1990  2015-04-04 12:38:35 
1920  2015-04-03 10:18:21 
1080  2015-04-01 10:18:21 
1750  2015-01-28 12:38:59 
1920  2015-01-19 17:20:20 
1920  2015-01-17 15:10:10 
1080  2015-01-13 20:18:41 
1920  2014-04-04 10:31:15 
1750  2013-10-04 10:39:20 

在2015年1月,用户1750年和1920年访问了同一个地方,以便重复共计客户2.在2015年4月,用户1750,1920和1080访问同一个地方如此重复共计客户3.输出应是这样的

Month    New  Repeat 
---------------------------------------------- 
October 2013  1   0 
April 2014   1   0 
January 2015  1   2 
April 2015   2   3 
+0

两'2014年4月'行?这是如何运作的? –

+0

我试过了一段代码,但是这是月份和年份的分组。它只是给我一个月内的总数。我想区分新的和重复的。这就是我现在挣扎的地方。 – Chopra

+0

@MarcB对不起,这是一个错字。我已纠正它。 – Chopra

回答

2

一种方法是使用子查询为每个用户获取第一次访问的日期。然后加入这一信息,并使用count(distinct)计算用户的数量:

select year(v.visited_at) as yyyy, month(visited_at) as mm, 
     count(distinct user_id) as num_users, 
     count(case when v.visited_at = vv.minva then user_id end) as num_new_users 
from visits v join 
    (select user_id, min(visited_at) as minva 
     from visits t 
     group by user_id 
    ) vv 
    on v.user_id = vv.user_id 
group by year(v.visited_at), month(visited_at) 
order by year(v.visited_at), month(visited_at); 

我注意到,这使总用户和新用户;重复是不同的。

+0

这就像一个魅力!欣赏它。 – Chopra

+0

这是用于月份和年份。我是否也可以在一个月内明智地做到这一点,还是必须写另一个查询?例如一个人在2015年4月2日和4月3日参观了同一个地方,他的第一次访问是在2014年4月12日。因此,在2014年4月12日,新的将是1并重复0.在2015年4月2日,重复1和2015年4月3日,这将是新的 - 0并重复1. – Chopra

+0

@Chopra。 。 。请问这是一个不同的问题 - 以及样本数据和期望的结果(这些确实有助于澄清问题)。 –

0

像这样将工作:

SELECT * FROM table_name WHERE updated_at >= CAST('2014-02-01' AS DATE) AND updated_at <= CAST('2014-02-28' AS DATE); 
0
SELECT 
    MONTH(created_at) as _Month, 
    YEAR(created_at) as _Year, 
    COUNT(*) as New 
FROM 
    yourtable 
GROUP BY 0,1 

您也可以使用where子句过滤结果。

+0

什么是0,1?这是错字吗?我从来没有听说过这件事? – Chopra

+0

这是所选列的参考。你也可以使用GROUP BY字段名,字段名称 –

+0

我已经写了这个逻辑按月份和年份分组。我想区分新客户和重复客户。这就是我挣扎的地方。 – Chopra