Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:一月份新用户最多的国家?_Mysql_Postgresql - Fatal编程技术网

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子句的用途)。你可以做一些研究,看看有什么不同,在哪里可以了解更多。谢谢!我真的很感谢你的投入和帮助:)克劳迪娅