【发布时间】:2023-03-13 17:49:01
【问题描述】:
我正在尝试计算每个国家/地区在 1 个月内的 DAU 平均值。查询的工作是:
- 识别唯一用户
- 查找上次登录的所有用户 月
- 将它们分成不同的日子
- 将它们细分为 各国
- 计算每个国家/地区的平均值。
到目前为止,我已经完成了第 1、2、3 和 4 步,但最后一步被证明很棘手。
该查询应该首先计算子查询,在该子查询中计算有多少活跃用户在上个月打开了应用程序,然后将它们分组到日期和国家/地区。 在此之后,它应该使用它在子查询中计算的所有 30 天数据来计算每个国家的平均 DAU。 结果将是一个国家列表及其平均 DAU。
到目前为止的查询如下所示:
SELECT Country, AVG(User_ID)
FROM usersession
WHERE User_ID IN
(SELECT count(distinct us.User_ID)
FROM usersession us
WHERE Opened > current_timestamp - interval 1 month
GROUP BY DAY(Opened), Country)
GROUP BY Country ORDER BY Country;
子查询执行第 1、2、3、4 步,但子查询之外的辅助查询并没有按预期工作。
表格如下(只是相关信息的一个简短示例):
ID | UserID | Opened | Country
-----------------------------------------------
233231 1 2017-11-20 08:00:00 NA
223214 2 2017-11-20 08:53:00 DK
预期结果(总共约 230 个国家/地区):
Country | Average
------------------
NA 150354
DK 60345
FI 50242
实际结果:
+---------+--------------+
| Country | AVG(User_ID) |
+---------+--------------+
| NULL | 804397.7297 |
| | 746046.7500 |
| BR | 893252.0000 |
| GB | 935599.0000 |
| RU | 993311.0000 |
| US | 735568.0000 |
+---------+--------------+
【问题讨论】:
-
请修复你的数据库标签,看起来像 SQL-SERVER 而不是 MYSQL
-
distinct不是函数!删除那些多余的括号以使事情更清楚,即改为使用count(distinct us.User_ID)。 -
其实是mysql :) 为了看得更清楚,我删除了箭头。
-
不清楚您问题中的查询是如何工作的。
User_ID IN (count of something GROUP BY something)有什么意义?请edit澄清您的问题。 -
“不只是按预期工作” 不是问题描述。你想要什么?你得到了什么?发布预期与实际输出数据。