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_
相关推荐
计算机编程小咖29 分钟前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
小四的快乐生活1 天前
Hive 存储管理测试用例设计指南
hive·hadoop·测试用例
没有梦想的咸鱼185-1037-16631 天前
SWMM排水管网水力、水质建模及在海绵与水环境中的应用
数据仓库·人工智能·数据挖掘·数据分析
三劫散仙1 天前
mac m1上使用Kerberos访问远程linux hadoop集群的正确姿势
linux·hadoop·macos
源图客1 天前
Apache Ozone 2.0.0集群部署
hadoop·ozone
计算机毕设残哥1 天前
大数据毕业设计推荐:基于Hadoop+Spark的手机信息分析系统完整方案
大数据·hadoop·课程设计
PawSQL2 天前
十年磨一剑!Apache Hive 性能优化演进全史(2013 - )
大数据·hive·性能优化
派可数据BI可视化2 天前
解读商业智能BI,数据仓库中的元数据
大数据·数据仓库·数据分析·spark·商业智能bi
老刘聊集成2 天前
ETL 工具选型评测:2025 年 Top 5 工具优缺点对比(附评分表)
数据仓库·etl
越来越无动于衷2 天前
Spring Boot 整合 Spring MVC:自动配置与扩展实践
数据仓库·hive·hadoop