最近在工作中,业务方提出了一个对数据监控预警的需求。即统计每日的数据量差异,如果此差异超过某个设定的阈值,将会自动邮件给相关的数据维护人员,查找出造成数据量波动较大的原因,及时做出相应调整,防止数据缺失的风险。

在实际的业务需求中,常常会让你统计当天与前一天数据差异的指标。

假设表t_tier的结构及存储数据如下:

uid name phone tier
001 ZHANGSAN 13535211451 A
002 LISI 15571211461 B
003 WANGWU 13531218451 A
004 ZHAOLIU 13531221457 C
005 TOM 13131216451 B
006 LILEI 13941211351 B
007 HANMEIMEI 13531211451 C
008 DABAO 18532219451 A

uid的tier每天都会变化(比如:6月24属于A,6月25属于B),故将该表放在在调度系统中每日跑数,就会造成类别A、B、C每日的数据量不同

现要统计每个类别当天与前一天数据的差异指标,表结构如下,t_differ

思路:

1、首先,创建一个分区表t_total,统计出每日每个类别的总量,存入当日分区;

2、接着,选出t_total表中日期最大的条目再与t_total自连接,过滤出当日与前日的数据,然后计算相应指标。

代码实现:

--创建存储每日各版本标签总量的表
create table t_total (                      data_date string comment'日期',tier string comment'标签',today_total string comment '今日标签总数'
) partitioned by (dt string comment '分区字段,值同data_date')set hive.exec.dynamic.partition.mode=nonstrict; --设置自动分区
insert overwrite table t_total partition(dt)
select
t.data_date
,t.tier
,t.today_total
,t.data_date as dt
from (
select
'$now.date' as data_date --'$now.date',python脚本中的写法
,tier
,count(*) as today_total
from t_tier
group by tier) t 
--创建数据差异表(可分区,可不分区)
create table t_tier_total_monitor (                      data_date string comment'日期',tier string comment'标签',yesterday_total string comment '昨日标签总数',today_total string comment '今日标签总数',diff_rate string comment '昨日和今日差异'
) partitioned by (dt string comment '分区字段,值同data_date')
-------------------------------------------------------------------------------------
--统计两天数据差异的方法一:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table t_tier_total_monitor partition(dt)
select b.today as data_date
,b.tier
,(case when a.today_total is not null and a.today_total<>'0' then a.today_total else 'NaN' end) as yesterday_total
,b.today_total as today_total
,(case when b.today_total is not null and b.today_total<>'0' then round((cast(((b.today_total-a.today_total)/b.today_total*100) as double)),2) else 'NaN' end)as diff_rate
,b.today as dt
from t_total a
left join
(select tier
,today_total
,data_date as today
,row_number() over(partition by tier order by data_date desc) as rn
from t_total) b  --从t_total表中筛出最近一天的数据(当天数据)
on a.tier=b.tier
where date_sub(b.today,1)=a.data_date and b.rn=1 --筛选出最近一天减1天等于前一天的数据

使用lag()函数

--统计两天数据差异方法二:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table t_tier_total_monitor(dt)
select
data_date
,tier
,lag(today_total,1,'NaN') over(partition by tier order by data_date) yesterday_total
,today_total as today_total
,round((cast((((today_total-lag(today_total,1,'NaN') over(partition by tier order by data_date))/lag(today_total,1,'NaN') over(partition by tier order by data_date))*100) as double)),2) diff_rate
,dt
from t_total

lag()/led()分析函数

lag与lead函数是跟偏移量相关的两个分析函数

通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤,该操作可代替表的自联接,且效率更高

lag()/lead()
  lead(field, num, defaultvalue)
    field: 需要查找的字段
    num: 往后查找的num行的数据
    defaultvalue: 没有符合条件的默认值
over()
  表示lag()与lead()操作的数据都在over()的范围内,里面可以使用以下子句
    partition by 语句(用于分组)
    order by 语句()用于排序)
  如:over(partition by a order by b) 表示以a字段进行分组,再以b字段进行排序,对数据进行查询。

参考:https://www.cnblogs.com/shiliye/p/12361624.html

hsql统计两天数据差异的算法及lag()/led()分析函数的使用相关推荐

  1. 查询时拼接两列数据_如何用VBA代码查询两列数据差异?

    爱就一个字,我只说一次-- 北京市第三交通委提醒您:代码千万条,注释第一条,命名不规范,修订两行泪-- 咳,给大家拜晚年了,再提前祝大家元宵快乐-- 我们今天和大家分享的内容是如何用VBA代码查询两列 ...

  2. Excel如何统计两列数据有多少重复值

    如下图.是某班级期中和期末考试前二十名学生名单,现在想要快速统计出两次考试均在前二十名的学生人数. 在D2单元格输入公式=COUNT(MATCH(A2:A21,B2:B21,0)),以CTRL+SHI ...

  3. 找出两列数据的差集_excel快速查找数据差异项

    近来在网上看到一则查找两列数据差异项的方法,试着做发现07版的excel根本就没有那个功能,而且设置过程也很麻烦,有那个功夫,不如去网上找函数公式解决.今天给大家分享一下用函数组合公式和自定义函数公式 ...

  4. 比较两组数据的差异用什么图更直观_试验数据统计中常用的 量,图,和线再也不担心文章的统计用图了!...

    本文来源:小麦研究联盟 今天跟大家详细总结一下我们农业试验数据统计中常用的 量,图,和线. 如果不想看下边长篇大论,请看小编给您总结的懒人包: 标准差: 群体的标准差是群体中所有数据方差的平方根,它衡 ...

  5. python怎么分析数据差异的方法_如何比较两组数据之间的差异性

    展开全部 1, 首先,分别把这两组数据分别设为x和y,打开SPSS,点击左下角的Variable  View选项卡,e5a48de588b6323131333532363134313032313635 ...

  6. 比较两组数据的差异用什么图更直观_用8分钟给你讲讲line graph的写法

    我是雅思写作老师宋京航,这是我的第一篇教学文章/视频.按照常规操作,我可能需要给你讲一下考试介绍和考情分析,但是那些百度能搜到的废话我确实不想写.那么, 我们直接进入正题.以上有吹拉弹唱视频版,以下润 ...

  7. 检验两组数据是否显著差异_SPSS非参数两个相关样本检验

    01 原理与方法 两个相关样本检验的方法主要有:Wilcoxon检验.Sign(符号)检验.McNemar检验和Marginal Homogeneity(边际同质性)检验等. Sign(符号)检验 配 ...

  8. EL之Bagging(DTR):利用DIY数据集(预留30%数据+两种树深)训练Bagging算法(DTR)

    EL之Bagging(DTR):利用DIY数据集(预留30%数据+两种树深)训练Bagging算法(DTR) 目录 输出结果 设计思路 核心代码 输出结果 1.treeDepth=1 2.treeDe ...

  9. python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)

    使用limma包进行差异基因分析时,做最多的是两分类的,例如control组和disease组,但也会碰到按照序列进行的分组.这时,如果逐一使用两两比较求差异基因则略显复杂.其实开发limma包的大神 ...

最新文章

  1. Android平台利用OpenCL框架实现并行开发初试
  2. 手把手教你实现一个 Vue 进度条组件!
  3. nginx openresty content_by_lua_file 404错误
  4. 解析网站发布系统利用ASP生成静态页面的方法
  5. win7下mongodb 2.6安装方法
  6. Spring MVC 启动
  7. ARP攻击网络上不去,可以进行mac地址绑定
  8. 编程界的“二向箔”——Dart元编程
  9. 正会最后一日,ACL 2017最佳论文和终身成就奖揭晓 | ACL 2017
  10. hough变换是如何检测出直线和圆的?
  11. 我的世界f服务器自定义皮肤,我的世界服务器皮肤指令
  12. Ring Buffer介绍
  13. 鸿蒙818工艺,荣耀智慧屏系列发布:鸿鹄818芯片+首款鸿鹄系统产品,未来家庭中心已来,3799元起售...
  14. qq手机邮箱服务器设置方法,手机qq邮箱imap设置图文教程
  15. 西方各国高职高专教育模式
  16. 无法访问计算机0x80070035,出现错误代码0x80070035,无法访问共享文件夹,解决方法...
  17. 前有莫雷,今有清华学霸要求公开华人程序员自杀真相,被Facebook开除了
  18. 苹果系统虚拟计算机win7,Mac虚拟机安装Win7 64位系统教程_苹果虚拟机安装Win7真的很简单...
  19. 杭州购买油车流程笔记
  20. SpringBoot结合MyBatis 【超详细】

热门文章

  1. BOA 服务器从-1000开始学习(博客搬运工)
  2. 渗透测试中用到的一些基本知识
  3. Tushare学习文档(八 银行间同业拆放利率)
  4. 开发工具合集专题《管理工具,DoxygenAPI文档自动生成》
  5. Windows server 2022 组策略软件分发
  6. matlab中如何定义整形变量,MATLAB中定义变量的问题
  7. 免疫荧光实验相关的注意事项汇总
  8. 人机猜拳游戏(修改)
  9. postgresql 遍历参数_《go语言从入门到入坟》json操作、文件操作
  10. [转] 单片机硬件设计 转载自 麦麦