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

网友投稿 967 2022-10-07

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

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

最近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表

id

job_id

start_time

status

1

1

2017-12-08 00:00:00

failed

2

2

2017-12-08 01:00:00

success

3

3

2017-12-08 02:00:00

running

4

1

2017-12-08 00:30:00

success

5

2

2017-12-08 01:30:00

running

6

3

2017-12-08 02:30:00

failed

首先我们可以首先根据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_id

status

1

success

2

running

3

failed

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序开发中Android请求失败如何处理(小程序请求失败怎么回事)
下一篇:微信小程序开发中怎样实现数据交互(微信小程序开发中怎样实现数据交互模式)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~