Hive分组取满足某字段的记录

在SQL分组后取第一条记录中介绍了分组取满足条件的第一条记录的方法,现在业务上面临如此需求:在做公司流程监控时,要求监控每个流程每个节点的用时情况。其中有个字段isend可以判断流程是否结束,但是流程结束后可能还会有操作(例如转发、会签等),分析时需要将结束后的节点删除掉。

思路:根据流程ID分组,按照操作时间从小到大排序,得到字段rk,根据流程ID和isend分组,按照操作时间从小到大排序,得到字段rk_。rk_=1说明是流程开始节点或者第一个结束节点,如果rk<=rk_说明节点是在isend=0的分组里还没有结束。

sql 复制代码
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_
相关推荐
freejackman21 小时前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
陈年老古董1 天前
ClickHouse 单机搭建记录
hive·笔记·学习·clickhouse·硬件架构
Gl�ria1 天前
Hadoop 速刷:HDFS / MR / YARN / Spark / Hive
hadoop·hdfs·mr
陈年老古董1 天前
Spark 3.1.3 集群搭建 + Spark-SQL 整合 Hive 记录
hive·sql·spark
FserSuN1 天前
Hive 分区表存储与查询优化学习总结
hive·hadoop·学习
注塑机数据采集联网2 天前
数据采集网关入门:ZK-D1/D3从零开始构建你的数据运用
大数据·数据仓库·人工智能·物联网·数据库架构·注塑机网关
测试盐2 天前
spark作业日志定位过程
java·hadoop·spark
roman_日积跬步-终至千里2 天前
【数据建模入门】从一家小店看懂数仓与机器学习:先理业务,再串技术
数据仓库·人工智能·机器学习·数据分析·数据建模
步行cgn2 天前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
程序员梅雨3 天前
【从零开始学习数据仓库 | 第二篇】: 拉链表 & 数仓分层
大数据·数据仓库·学习