这是我在SO上的第一篇文章。所以我完全有可能违反很多发布规则。如果是这种情况,请告诉我,我会确保不再重复。
我一直试图在Hive的同一查询中获得滚动平均值和绝对数字,这就是我所拥有的。这在Redshift中完美运行,但在Hive中给了我一个错误。看起来不支持select语句中的子查询。想知道我是否可以获得一些关于如何修改此查询的指示,以便从Hive中获得相同的结果。
select
a.ds,
a.traffic_source,
a.device_type,
count(distinct a.unique_id) as daily_deduped_visits_human,
(select
count(distinct b.unique_id)
from
scratch.unique_human_id b
where
b.ds >= a.ds - 28
and b.ds <= a.ds
and a.traffic_source = b.traffic_source
and a.device_type = b.device_type
)/28 as rolling_28_day_average_visits_human
from
scratch.unique_human_id a
group by 1,2,3
答案 0 :(得分:0)
您的示例中的技术称为相关子查询,并且往往非常慢。我建议使用带有range子句的window函数。
首先,在子查询中,计算每天的指标。然后在主选择使用窗口函数来计算滚动总和/平均值。 See more window function examples in the Redshift docs.
SELECT a.ds
, a.traffic_source
, a.device_type
, a.daily_deduped_visits_human
, SUM(a.daily_deduped_visits_human)
OVER (PARTITION BY a.traffic_source, a.device_type
ORDER BY a.ds
ROWS BETWEEN 28 PRECEDING AND CURRENT ROW
) AS rolling_28_day_total_visits_human
, AVG(a.daily_deduped_visits_human)
OVER (PARTITION BY a.traffic_source, a.device_type
ORDER BY a.ds
ROWS BETWEEN 28 PRECEDING AND CURRENT ROW
) AS rolling_28_day_average_visits_human
FROM (-- First calc the metric
SELECT a.ds
, a.traffic_source
, a.device_type
, COUNT(DISTINCT a.unique_id) AS daily_deduped_visits_human
FROM scratch.unique_human_id a
GROUP BY 1,2,3
) a
GROUP BY 1,2,3,4
ORDER BY a.traffic_source
, a.device_type
, a.ds
;