sql - 如何在我的子选择中删除相关子查询(由于 presto 限制)

标签 sql hive correlated-subquery presto

我试图找出过去大约 2 个月内在 14 天滚动窗口内执行特定操作(p.action 中的任何行)的美国用户的不同数量。

这是查询。我喜欢一些关于如何重写它以不使用相关子查询的提示,因为 Presto 不允许它们。

SELECT dt,
    (SELECT COUNT(DISTINCT user_id)
     FROM p.action
     WHERE dt BETWEEN q.dt - 13 AND q.dt -- period of 14 days
        AND country = 'US'
     ) AS 14d_rolling_users
FROM p.action q
WHERE dt BETWEEN '2016-08-24' AND '2016-10-24'  
GROUP BY dt
ORDER BY dt ASC

我一直在绞尽脑汁想弄清楚如何在不运行 60 个单独的查询(每天一个)的情况下完成这项工作。

任何帮助表示赞赏,谢谢!

最佳答案

没有使用 presto 的经验,但从逻辑上讲,您可以重写查询以执行 p.action 的笛卡尔积连接(无条件连接)。带有 p.action 的 2 个月日期限制使用相同的 2 个月日期限制,则不需要内部查询。

SELECT dt,COUNT(DISTINCT user_id)
FROM p.action q1,p.action q2  
WHERE q1.dt BETWEEN '2016-08-24' AND '2016-10-24'  
  AND q2.dt BETWEEN '2016-08-24' AND '2016-10-24' 
  AND q1.dt BETWEEN q2.dt - 13 AND q2.dt -- period of 14 days
  AND country = 'US'
GROUP BY q1.dt
ORDER BY q1.dt ASC

事先创建 2 个月的表会更有效 - 这里条件在连接之后应用。

关于sql - 如何在我的子选择中删除相关子查询(由于 presto 限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40299323/

相关文章:

mysql - 显示从属主机;有一个空的主机输出。如何获取从属主机?

sql - SQL Server 2008 R2 上的自定义主键

hive - 访问被拒绝 - EMR Presto - 基于文件的授权

hadoop - Hive alter table 语句

sql - 我需要编写一个查询来列出所有员工及其下属数量

mysql - 如何选择未回答的问题?

hadoop - 如何为Hive中的不同列指定其他定界符?

sql - where 子句中的非相关 exists(...) 查询是针对每一行执行还是仅执行一次?

mysql - 如何将关联子查询与外表连接起来?

MySQL - 使用同一表上的子查询的值进行更新