我有一张包含特定日期和产品类型的表格
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
Run Code Online (Sandbox Code Playgroud)
我试图计算每一行,从过程日期开始的最近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
Run Code Online (Sandbox Code Playgroud)
目前我正在进行自我加入
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;
Run Code Online (Sandbox Code Playgroud)
这个查询花了很长时间,因为表非常大.我想知道是否有使用窗口函数的替代方法来执行此操作.
谢谢!
这可以通过使用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
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
4055 次 |
| 最近记录: |