Hive SQL实现近N周的数据统计查询

发布于:2025-03-31 ⋅ 阅读:(19) ⋅ 点赞:(0)

文/朱季谦

先前遇到过一个需求,需要基于HIVE统计近N周范围的数据,例如,统计近7周范围的数据指标。

需要用HIVE SQL去实现该功能,而HIVE SQL并没有PostgreSQL那样例如通过函数to_char((to_date('202550', 'YYYWW') - INTERVAL '5 weeks'), 'yyyyww'))就可以实现202550和往前5周的202545周的查询(这里的50和45分别表示2025年的50周和45周)。

我当时通过百度和DeepSeek都没有找到合适的答案,还是思考了好几天才想明白怎么解决。

既然HIVE SQL没有函数可以直接实现取指定周与近N周的条件范围查询,是否可以有其他方式呢?

答案是肯定的。

我当时是通过额外建一个时间表,该表有天以及天对应的所在周,可以直接通过代码生成这样一张表date_week_table,直接 从2020年一直自动映射到2030年,该表的数据如下:

id Day Week
1 2020-01-01 202001
2 2020-01-02 202001
3 2020-01-03 202001
4 2020-01-04 202001
5 2020-01-05 202001
6 2020-01-06 202002
7 2020-01-07 202002
8 2020-01-08 202002
....... ...... ......

当有这一张周表,而需要查询近N周范围数据的主表由有week字段,例如主表commerce_data是这样的——

id order_id customer_id product_id week total_amount
1 ORD202315001 1001 5001 202501 5
2 ORD202315002 1002 5002 202452 10
3 ORD202315003 1003 5003 202451 22
4 ORD202315004 1004 5004 202450 1
5 ...... ...... ...... ...... ......

这时,如果需要统计指定周和前N周的数据,就可以基于这两张表去实现。

例如,查出2025年第1周往前近4周的数据。

可以基于date_week_table周表计算2025年第1周往前近4周都有哪些周,HIVE SQL如下:

select distinct week from date_week_table where week <= '202501' order by week desc limit 3

然后再基于commerce_data主表计算在2025年第1周往前近4周的数据——

select 
sum(total_amount) 
from commerce_data 
where week in(select distinct week from date_week_table where week <= '202501' order by week desc limit 3) 
group by order_id

这样,就可以实现查询出指定周及指定周近N周的HIVE SQL查询了。

当然,也有童鞋可能会说,既然只是查询近N周范围,是否可以直接使用指定周,再减去N来差呢?

这里会有一个问题,2025年第一周,即202501,往前两周,分别是202452和202451,如果用指定周202501直接减2,得到的并不是202451。

以上,只是我个人的一个思路,如果还有其他基于HIVE SQL来计算指定周及近N周的计算,可以留言区一块分享讨论。