Hive分组剔除每组某些记录

本文介绍了一种在SQL查询中,通过分组和排序策略来监控公司流程每个节点的用时情况,同时排除流程结束后可能的后续操作,只保留开始节点和首次结束节点的数据。
摘要由CSDN通过智能技术生成

SQL分组后取第一条记录中介绍了分组获取每组第一条记录的方法,现在业务上面临如此需求:在做公司流程监控时,要求监控每个流程每个节点的用时情况。其中有个字段isend可以判断流程是否结束,但是流程结束后可能还会有操作(例如转发、会签等),分析时需要将结束后的节点删除掉。
思路:根据流程ID分组,按照操作时间从小到大排序,得到字段rk,根据流程ID和isend分组,按照操作时间从小到大排序,得到字段rk_。rk_=1说明是流程开始节点或者第一个结束节点,如果rk<=rk_说明节点是在isend=0的分组里还没有结束。

insert overwrite table dwd.dwd_tableName_di
select 
	requestid,
	workflowname,
	nodename,
	operdate,
	isbereject,
	rk,
	row_number() over(partition by requestid order by operdate desc) as rk_desc,
	pre_node_time,
	datediff(operdate,pre_node_time) as node_diff_days,
	round((unix_timestamp(operdate,'yyyy-MM-dd HH:mm:ss')-unix_timestamp(pre_node_time,'yyyy-MM-dd HH:mm:ss'))/3600) as node_diff_hours,
	unix_timestamp(operdate,'yyyy-MM-dd HH:mm:ss')-unix_timestamp(pre_node_time,'yyyy-MM-dd HH:mm:ss') as node_diff_seconds
from(
select 
	requestid,
	workflowname,
	nodename,
	operdate,
	isbereject,
	row_number() over(partition by requestid order by operdate) as rk,
	lag(operdate,1,null) over(partition by requestid order by operdate) as pre_node_time,
	row_number() over(partition by requestid,isend order by operdate) as rk_
from (
	select
		requestid,
		nodename,
		workflowname,
		concat(operatedate,' ',operatetime) as operdate,
		isbereject,
		isend
	from 
		dbname.tableName
)tmp
)ttt 
where rk_ = 1 or rk <= rk_
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值