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

app分享君 / 03-30 / 9点赞 / 0评论 / 768阅读
一个需求,需要基于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如下: ```sql select distinct week from date_week_table where week <= '202501' order by week desc limit 3 ``` 然后再基于commerce\_data主表计算在2025年第1周往前近4周的数据—— ```sql 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周的计算,可以留言区一块分享讨论。