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

8 阅读3分钟

文/朱季谦

先前遇到过一个需求,需要基于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年,该表的数据如下:

idDayWeek
12020-01-01202001
22020-01-02202001
32020-01-03202001
42020-01-04202001
52020-01-05202001
62020-01-06202002
72020-01-07202002
82020-01-08202002
...................

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

idorder_idcustomer_idproduct_idweektotal_amount
1ORD202315001100150012025015
2ORD2023150021002500220245210
3ORD2023150031003500320245122
4ORD202315004100450042024501
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周的计算,可以留言区一块分享讨论。