2017-03-17 14 views
0

我有2个表,用户和事件:MYSQL:一月份拥有最多新用户的国家?

**Users:** 
usersid 
age 
geo_country 
gender 

**events:** 
ts 
usersid 
event 
videoid 

Ts是时间戳字段。而可能的事件是“start_video”,“browse_catalog”,“exit_video”

我想找出哪个国家有最新用户在一月份。

我的代码如下:

SELECT DISTINCT (u.geo_country), COUNT(e.userid) As Users_Ids 
    FROM (SELECT userid, DATE(MIN(ts)) AS first_time 
      FROM events 
      WHERE ts BETWEEN '2017-01-01 00:00:00' and '2017-01-31 24:00:00' 
      GROUP BY userid) AS e 
    LEFT JOIN users u ON u.userid= e.userid 
    GROUP BY first_time 
    ORDER BY COUNT(e.userid) DESC; 

由于我没有会议场,是我的子查询没事在2017年一月提供新用户?

任何帮助将不胜感激。

感谢,

克劳迪娅

+0

不完全是。像现在查询将选择在一月你需要选择'分(TS)'什么有什么事件的所有用户,而不'between'选择第一次登录的所有用户(或'分钟(TS)为FIRST_TIME其中TS <“2017-01 -31 24:00:00'')。只有然后检查'first_time between ...' –

回答

0

我认为您发布的查询略有不正确。

理论上,GROUP BY应该描述如何为聚合函数分组数据。在主查询,要通过国家计数的用户,所以不是由FIRST_TIME分组,聚集COUNT应该GROUP BY去u.geo_country,也作为一个结果,DISTINCT geo_country上的不再需要。

GROUP BY first_time也会提供错误的答案,因为它提供了不是由唯一国家记录的每个唯一first_time的用户数量的聚合。

正确的查询应该是:

SELECT u.geo_country, 
     COUNT(e.userid) As Users_Ids 
FROM (SELECT userid, DATE(MIN(ts)) AS first_time 
     FROM events 
     GROUP BY userid 
     HAVING first_time BETWEEN '2017-01-01 00:00:00' and '2017-01-31 24:00:00') 
AS e 
LEFT JOIN users u ON u.userid= e.userid 
GROUP BY u.geo_country 
ORDER BY Users_Ids DESC; 
+0

感谢这个提示泰语! – Claudia

+0

只是有一个简单的问题:如果问题询问的用户数最多的国家,为什么按Users_Ids排序? – Claudia

+0

Users_Ids是聚合函数结果的别名,通过它的排序是一样的,你使用COUNT排序。此外,Order By子句是在计划查询和检索数据集之后运行的子句,它不会影响查询结果。 –

相关问题