文/朱季谦

先前遇到过一个需求,需要基于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周的计算,可以留言区一块分享讨论。

Hive SQL实现近N周的数据统计查询的更多相关文章

  1. mysql按年度、季度、月度、周、日统计查询的sql语句

    本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据   SELECT * FROM blog_arti ...

  2. sql处理百万级以上的数据提高查询速度的方法

    原文:http://blog.csdn.net/zhengyiluan/article/details/51671599 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中 ...

  3. 《转》sql处理百万级以上的数据提高查询速度的方法

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  4. 009-Hadoop Hive sql语法详解4-DQL 操作:数据查询SQL-select、join、union、udtf

    一.基本的Select 操作 语法SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_reference[WHERE whe ...

  5. sql 数据库中只靠一个数据,查询到所在表和列名

    有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,在网上搜了一下,找到一个比较好的方法,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将 ...

  6. [MySQL] 按年度、季度、月度、周、日统计查询

    该死的mysql没有提供unix时间戳的专门处理函数,所以,如果遇到时间分组,而你用的又是整型unix时间戳,则只有转化为mysql的其他日期类型!   FROM_UNIXTIM()将unix时间戳转 ...

  7. Postgre Sql获取最近一周、一月、一年日期函数

    使用Postgre Sql获取近一周.一年.一月等系统函数调用如下,使用方面相对于Ms Sql server 容易了许多. --当前时间 select now(); --current_timesta ...

  8. Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询

    1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...

  9. SQL SERVER 月、季、年统计与常用查询语句汇总

    一.SQL SERVER 月.季.年统计查询 --本天 SELECT *FROM dbo.TableName WHERE DATEDIFF(DAY,TimeField,getdate())= 0; - ...

  10. 【甘道夫】使用HIVE SQL实现推荐系统数据补全

    需求 在推荐系统场景中,假设基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果非常可能达不到要求的数量. 比方,希望针对每一个item或user推荐20个item,可是通过计算仅仅得到8个 ...

随机推荐

  1. 记录uniapp上传图片转base64

    // 图片转base64 imageToBase64() { return new Promise((reslove, reject) => { uni.getFileSystemManager ...

  2. 题解:AT_abc386_d [ABC386D] Diagonal Separation

    分析题面,发现题目求的是是否存在一个白点被 \((1, 1)\) 和任意一个黑点围成的矩形内. 先将所有黑点按 \(x\) 坐标排序. 枚举所有的白点. 找到所有横坐标不比该白点横坐标小的所有黑点的纵 ...

  3. git与svn的对比-copy

    SVN与Git比较的优缺点差异   目录: SVN与Git比较(一)集中式vs分布式 SVN与Git比较(二)版本库与工作区 SVN与Git比较(三)全局版本号和全球版本号 SVN与Git比较(四)部 ...

  4. runoob-Lua 教程

    https://www.runoob.com/lua/lua-tutorial.html Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. ...

  5. Mysql死锁问题如何排查和解决

    Mysql 查询是否存在锁表有多种方式,这里只介绍一种最常用的. 1.查看正在进行中的事务SELECT * FROM information_schema.INNODB_TRX2.查看正在锁的事务SE ...

  6. 分布式多级缓存(本地缓存,redis缓存)

    结构包: 使用案例: 实现效果: 1.基本并发的本地缓存,基于分布式轻量级锁的redis缓存 2.热缓存(高频访问持续缓存)+快速过期(本地缓存2秒,redis缓存10秒) 3.方法级别缓存清理 (@ ...

  7. Kotlin:定义参数是函数的函数、函数内联、具名函数的函数引用

  8. 解决StringBuilder readline阻塞问题

    readline之所以会阻塞socket流没有结束符 阻塞场景:read() 没有读取到任何数据 readLine() 没有读取到结束符或者换行符 可以用ready判断通道中数据是否读完,读完返回fa ...

  9. delphi中实现http请求和提交

    在对接本地的一个药械监管系统使用实现的代码,编译环境delphi Xe7 ,使用类TIdHTTP实现网络的get请求和post提交 //设置组件的属性 procedure TfrmMain.SetHt ...

  10. 性能飞跃!TensorRT-YOLO 6.0 全面升级解析与实战指南

    一.核心升级亮点速览 多Context共享引擎:高效推理,最大化硬件资源利用率 TensorRT-YOLO 6.0 引入了创新的多Context共享引擎机制,允许多个线程共享同一个Engine进行推理 ...