我不明白为什么我的 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