我试图找出过去大约 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/