mysql实现rownum()over_mysql中类似oracle的over() row_number()的功能实现

这篇博客介绍了如何在MySQL中实现类似Oracle的ROWNUM()功能,通过窗口函数OVER()结合ROW_NUMBER(),对数据进行排序和分组编号,以完成特定的数据处理需求。博主分享了具体的SQL更新语句,用于根据设备号、用户ID、书本ID和阅读时间进行排序和编号,并计算时间间隔。

从网上找了很多资料,参考了如下链接,完成了一个需求:下一行的开始时间,作为上一行开始时间的结束时间。

https://www.cnblogs.com/yhzh/p/6222580.html

以下是自己做的,可以忽略

-- 说明如下:

-- 先按照设备号,用户id,book_id,阅读时间 排序

-- 然后按照设备号分组,对组内的数据按时间 依次编号

-- 首先last_device_num 为空,

-- 第一行判断 device_num = null,所以赋值1,并把第一行的device_num 传递给last_device_num;

-- 第二行时,判断device_num是否等于上一行的device_num(即last_device_num),如果等,则递增,否则为1。

-- 第二行,纯粹是用来赋值。

UPDATE

xxx p,

(SELECT

n.id,

n.begin_time,

m.begin_time AS end_time,

TIMESTAMPDIFF(

SECOND,

n.begin_time,

m.begin_time

) AS interva

FROM

(SELECT

id,

device_num,

begin_time,

IF(

@last_device_num = a.device_num,

@rank := @rank + 1,

@rank := 1

) AS row_number,

@last_device_num := a.device_num

FROM

(SELECT

*

FROM

xxx

ORDER BY device_num,

user_id,

book_id,

begin_time ASC) a,

(SELECT

@rownum := 0,

@last_device_num := NULL,

@rank := 0) b) m

RIGHT JOIN

(SELECT

id,

device_num,

begin_time,

IF(

@last_device_num1 = a.device_num,

@rank1 := @rank1 + 1,

@rank1 := 2

) AS row_number,

@last_device_num1 := a.device_num

FROM

(SELECT

*

FROM

xxx

ORDER BY device_num,

user_id,

book_id,

begin_time ASC) a,

(SELECT

@rownum1 := 0,

@last_device_num1 := NULL,

@rank1 := 1) b) n

ON m.row_number = n.row_number

AND m.device_num = n.device_num) q

SET

p.`end_time` = q.end_time,

p.`read_time` = q.interva

WHERE p.id = q.id

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24349972/viewspace-2152443/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值