我不明白为什么我的 Athena (Presto) SQL 查询不起作用
I don't understand why my Athena (Presto) SQL query doesn't work
我有一个具体问题和一个更笼统的问题...对于上下文,我使用的是 Athena。这是我的具体问题:
1) 我正在尝试编写一个查询,计算按国家/地区细分的连续 2 个月的 DAU(我最终希望 DAUs/MAUs 按国家/地区和日期细分,但我想我会开始简单的...)。我对如何解决这个问题的想法是我需要两个查询,每个月一个,使用按国家/地区分组并应用必要的过滤器。最后,我将能够加入国家/地区以获得包含国家/地区的 1 列,以及包含两个月 DAUS 的以下列。这是我草拟的查询:
SELECT count(distinct uuid) m1, country
FROM user u1
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
INNER JOIN (SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018 GROUP BY country
) t ON t.country = u1.country
GROUP BY country
这有什么问题?错误:mismatched input 'join' expecting {<eof>
2) 我更笼统的问题是,在构造更复杂的查询时我应该如何思考?我已经编程多年,但我似乎总是发现自己陷入了复杂的 SQL 查询并在错误消息后点击错误消息(这似乎也几乎无法解释)。
感谢所有建议:)
where 和 group by 应该放在 where 连接子句之后
SELECT count(distinct uuid) m1, country
FROM user u1
INNER JOIN (SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018 GROUP BY country
) t ON t.country = u1.country
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
GROUP BY country
您想连接两个选择的结果:
SELECT t2.*, t.m2
FROM
(
SELECT count(distinct uuid) m1, country
FROM user u1
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
GROUP BY country
) as t2
JOIN
(
SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018
GROUP BY country
) as t
ON t.country = t2.country
但这将删除两个月都没有数据的国家/地区,然后您必须切换到 FULL OUTER JOIN。
在你的情况下,使用条件聚合:
要容易得多
SELECT country
,count(distinct case when month(date(dt)) = 12 AND YEAR(date(dt)) = 2018 then uuid end) as m1
,count(distinct case when month(date(dt)) = 11 AND YEAR(date(dt)) = 2018 then uuid end) as m2
FROM user
GROUP BY country
我有一个具体问题和一个更笼统的问题...对于上下文,我使用的是 Athena。这是我的具体问题:
1) 我正在尝试编写一个查询,计算按国家/地区细分的连续 2 个月的 DAU(我最终希望 DAUs/MAUs 按国家/地区和日期细分,但我想我会开始简单的...)。我对如何解决这个问题的想法是我需要两个查询,每个月一个,使用按国家/地区分组并应用必要的过滤器。最后,我将能够加入国家/地区以获得包含国家/地区的 1 列,以及包含两个月 DAUS 的以下列。这是我草拟的查询:
SELECT count(distinct uuid) m1, country
FROM user u1
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
INNER JOIN (SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018 GROUP BY country
) t ON t.country = u1.country
GROUP BY country
这有什么问题?错误:mismatched input 'join' expecting {<eof>
2) 我更笼统的问题是,在构造更复杂的查询时我应该如何思考?我已经编程多年,但我似乎总是发现自己陷入了复杂的 SQL 查询并在错误消息后点击错误消息(这似乎也几乎无法解释)。
感谢所有建议:)
where 和 group by 应该放在 where 连接子句之后
SELECT count(distinct uuid) m1, country
FROM user u1
INNER JOIN (SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018 GROUP BY country
) t ON t.country = u1.country
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
GROUP BY country
您想连接两个选择的结果:
SELECT t2.*, t.m2
FROM
(
SELECT count(distinct uuid) m1, country
FROM user u1
WHERE month(date(dt)) = 12
AND YEAR(date(dt)) = 2018
GROUP BY country
) as t2
JOIN
(
SELECT count(distinct uuid) m2, country
FROM user
WHERE month(date(dt)) = 11
AND YEAR(date(dt)) = 2018
GROUP BY country
) as t
ON t.country = t2.country
但这将删除两个月都没有数据的国家/地区,然后您必须切换到 FULL OUTER JOIN。
在你的情况下,使用条件聚合:
要容易得多SELECT country
,count(distinct case when month(date(dt)) = 12 AND YEAR(date(dt)) = 2018 then uuid end) as m1
,count(distinct case when month(date(dt)) = 11 AND YEAR(date(dt)) = 2018 then uuid end) as m2
FROM user
GROUP BY country