mysql中类似oracle的over() row_number()的功能实现
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,从网上找了很多资料,参考了如下链接,完成了一个需求:下一行的开始时间,作为上一行开始时间的结束时间。https://www.cnblogs.com/yhzh/p/6222580.html以下是自己做的
千家信息网最后更新 2026年11月01日mysql中类似oracle的over() row_number()的功能实现从网上找了很多资料,参考了如下链接,完成了一个需求:下一行的开始时间,作为上一行开始时间的结束时间。
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
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
一行
时间
设备
数据
用户
资料
链接
需求
分组
参考
排序
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技平台互联网
圆梦互联网科技
金融科技还是互联网
互联网科技的发展
互联网金融公司科技
上海挚品互联网科技
互联网科技作文
易通互联网络科技有限公司
奔汉互联网科技
郑州华宇互联网科技
阿里互联网科技公司
湖南诚度互联网科技有限公司
和信科技工业互联网
辽宁互联网新科技
本届互联网博览会上的黑科技
互联网科技圈年度人物
互联网时代的科技公司
长沙渺峰互联网科技有限公司
杭州科技互联网公司有哪些
上海互联网科技园景观
关于新基建和互联网科技
互联网教育科技公司vipkid
广州恒生互联网科技有限
互联网校园科技培训
恒生互联网科技指数跳水
江苏互联网科技小贷
长沙易易互联网科技有限公司
安徽九吞吴互联网科技有限公司
科技美学互联网 艺术
山东亿川互联网科技有限责任公司