MYSQL:一月份新用户最多的国家?
我有两个表、用户和事件:MYSQL:一月份新用户最多的国家?,mysql,postgresql,Mysql,Postgresql,我有两个表、用户和事件: **Users:** usersid age geo_country gender **events:** ts usersid event videoid 其中ts是时间戳字段。可能的事件有“开始视频”、“浏览目录”、“退出视频” 我想知道一月份哪个国家的新用户最多 我的代码如下: SELECT DISTINCT (u.geo_country), COUNT(e.userid) As Users_Ids FROM (SELECT userid, D
**Users:**
usersid
age
geo_country
gender
**events:**
ts
usersid
event
videoid
其中ts是时间戳字段。可能的事件有“开始视频”、“浏览目录”、“退出视频”
我想知道一月份哪个国家的新用户最多
我的代码如下:
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;
由于我没有session字段,我的子查询是否可以为2017年1月提供新用户
任何帮助都将不胜感激
谢谢
克劳迪娅我认为你发布的查询有点不正确 理论上,GROUP BY应该描述如何对聚合函数的数据集进行分组。在主查询中,您希望按国家/地区统计用户数,因此,聚合计数应与按u.geo_国家/地区分组一起进行,因此,不再需要按geo_国家/地区进行区分 按首次分组也将提供错误答案,因为它提供了非按唯一国家/地区记录的每个唯一首次用户的计数汇总 正确的查询应该是:
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;
不完全是。像现在这样的查询将选择1月份发生任何事件的所有用户。您需要选择
min(ts)
而不选择between
为所有用户选择第一次登录(或min(ts)作为第一次登录,其中ts
)。然后才检查第一次\u时间介于…
感谢您的提示!有一个简单的问题:如果问题是“新用户最多的国家/地区”,为什么要按用户\u id排序?用户\u id是聚合函数结果的别名,按它排序与按计数排序相同。此外,Order By子句是在计划查询和检索数据集之后运行的一个子句,它不会影响查询的结果。感谢Shiphonus在注释部分指出了一个逻辑错误(但不是正确的答案),我更新了anwser。问题是您希望确保第一个时间在1月份,因此您需要首先获取所有用户的第一个时间事件,然后再对其进行筛选(这正是HAVING子句的用途)。你可以做一些研究,看看有什么不同,在哪里可以了解更多。谢谢!我真的很感谢你的投入和帮助:)克劳迪娅