我有2个表,用户和事件:
**Users:**
usersid
age
geo_country
gender
**events:**
ts
usersid
event
videoid
其中ts是时间戳字段。可能的事件是'start_video','browse_catalog','exit_video'
我想找出1月份哪个国家/地区用户最多。
我的代码如下:
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年1月提供新用户?
任何帮助都将受到高度赞赏。
谢谢,
和Claudia
答案 0 :(得分:0)
我认为您发布的查询稍有不正确。
理论上, GROUP BY 应该描述如何为聚合函数分组数据集。在您的主要查询中,您希望按国家/地区计算用户数,因此聚合 COUNT 不应按first_time分组,而应使用 GROUP BY u。 geo_country ,因此,不再需要geo_country上的 DISTINCT 。
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;