mysql实现ROW_NUMBER() over (PARTITION BY xx ORDER BY ** DESC)

1 篇文章 0 订阅

最近HM给XSD一个需求,HM说现在我们的自动调度任务每天都运行了很多任务,而且每个任务又有失败重试的操作。你能给我查找出来今天的所有的失败任务(以最近时间为准)都有那些吗?XSD听到这个问题就愉快的去做了

XSD以前写过HIVE脚本,记得有个 PARTITION BY语句 通过 ROW_NUMBER() over (PARTITION BY xx ORDER BY ** DESC) as row_number 可以根据xx字段分组,在分组内根据**字段排序,然后赋予每一行数据一个行编号,通过 row_number = 1 就可以获得分组内的第一行的数字了。可是现在使用的是mysql,没有PARTITION BY语句 怎么办呢?最后在HM的帮助下XSD终于实现了。

首先列几个简单的字段
action_history表

idjob_idstart_timestatus
112017-12-08 00:00:00failed
222017-12-08 01:00:00success
332017-12-08 02:00:00running
412017-12-08 00:30:00success
522017-12-08 01:30:00running
632017-12-08 02:30:00failed

首先我们可以首先根据job_id 排序然后根据start_time进行二级排序

 select * from action_history
	              where left(start_time,10) = CURDATE()
	              order by job_id asc ,start_time desc

运行结果如下:
这里写图片描述

在下一步之前首先熟悉一下GROUP_CONCAT,这条语句会返回一个字符串,这个字符串由分组中的值连接组合而成。比如

select GROUP_CONCAT(status order by start_time desc )str from action_history

结果为
这里写图片描述
然后在这条sql的基础上就可以使用
SUBSTRING_INDEX( GROUP_CONCAT(status order by start_time desc),',',1)
就能得到最新的状态了
完整语句为:


select 
job_id,SUBSTRING_INDEX( GROUP_CONCAT(status order by start_time desc),',',1) status 
from 
(
	select
  job_id,status,start_time 
	from 
	action_history
	where 
	left(start_time,10) = CURDATE()
	order by job_id asc ,start_time desc
)b 
	GROUP BY job_id

这样就能得到所有的任务的最新的状态

job_idstatus
1success
2running
3failed

如果想得到success,failed或者running的任务 在这个最后这个基础上where条件进行status筛选就好啦~
XSD就这样在HM的帮助下完成了任务~

  • 16
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值