我有一张包含特定日期和产品类型的表格
Product Process_Date Prod_Count
A 2015-08-01 2
A 2015-09-03 2
A 2015-05-06 3
B 2014-01-01 4
B 2014-12-31 5
我正在尝试为每一行计算过程日期后最近6个月内的产品条目数(包括process_date)。所以输出应该看起来像
Product Process_Date Count
A 2015-08-01 5
A 2015-09-03 7
A 2015-05-06 3
B 2014-01-01 4
B 2014-12-31 5
目前我正在进行自我加入
SELECT
q.Product, q.Process_Date, SUM(Prod_Count) AS num_180days
FROM tableT p
INNER JOIN (
SELECT DISTINCT Product, Process_Date
FROM tableT
) q
ON p.Product = q.Product
WHERE Process_Date BETWEEN DATE_SUB(q.Process_Date, 180) AND q.Process_Date
GROUP BY q.Product, q.Process_Date;
这个查询需要很长时间,因为表非常大。我想知道是否有替代方法使用窗口函数来执行此操作。
谢谢!
答案 0 :(得分:6)
这可以通过使用Hive windows分析函数来完成,尽管根据文档的状态,这是不正确的。我发现官方Hive文档已过时且经常不正确。我通过阅读Hive JIRA找到了这个宝藏。有关其他窗口分析功能的更多信息,请参见原始JIRI:https://issues.apache.org/jira/browse/HIVE-4112。
有一个奇怪的限制,即窗口分析函数不能包含整数乘法。解决方法是预先乘以15552000 = 60 * 60 * 24 * 180秒或180天。
SELECT
product,
process_date,
prod_count,
sum(prod_count) OVER (
PARTITION BY product
ORDER BY unix_timestamp(process_date,'yyyy-MM-dd') ASC
RANGE BETWEEN 15552000 PRECEDING and CURRENT ROW) as count
FROM tableT
我希望这有帮助!