mysql中类似甲骨文的/()row_number()的功能实现

  从网上找了很多资料,参考了如下链接,完成了一个需求:下一行的开始时间,作为上一行开始时间的结束时间。
  
  以下是自己做的,可以忽略
  ——说明如下:
  ——先按照设备号,用户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 end_time,
  ,,TIMESTAMPDIFF (
  ,,,第二,
  ,,,n。begin_time,
  ,,,m。begin_time
  ,,)interva 
  ,从
  ,,(SELECT 
  ,,,id,
  ,,,device_num,
  ,,,begin_time,
  ,,,如果(
  ,,,,@last_device_num=a.device_num
  ,,,,@rank:=@rank + 1,
  ,,,,@rank:=1
  ,,,)row_number,
  ,,,@last_device_num:=a.device_num 
  ,,从
  ,,,(SELECT 
  ,,,,*,
  ,,,从
  ,,,,xxx
  ,,,ORDER BY device_num,
  ,,,,user_id,
  ,,,,book_id,
  ,,,,begin_time ASC),
  ,,,(SELECT 
  ,,,,@rownum:=0,
  ,,,,@last_device_num:=NULL,
  ,,,,@rank: b=0)) m 
  ,,正确的JOIN 
  ,,,(SELECT 
  ,,,,id,
  ,,,,device_num,
  ,,,,begin_time,
  ,,,,如果(
  ,,,,,@last_device_num1=a.device_num
  ,,,,,@rank1:=@rank1 + 1,
  ,,,,,@rank1:=2
  ,,,,)row_number,
  ,,,,@last_device_num1:=a.device_num 
  ,,,从
  ,,,,(SELECT 
  ,,,,,*,
  ,,,,从
  ,,,,,xxx
  ,,,,ORDER BY device_num,
  ,,,,,user_id,
  ,,,,,book_id,
  ,,,,,begin_time ASC),
  ,,,,(SELECT 
  ,,,,,@rownum1:=0,
  ,,,,,@last_device_num1:=NULL,
  ,,,,,@rank1:=1) b) n 
  ,,,在m。row_number=n.row_number 
  ,,,和m.device_num=n.device_num) q 
  设置
  ,p。“end_time”=问。end_time,
  ,p。“read_time”=q.interva 
  在p。id=q.id 
  
  
  
  
  

mysql中类似甲骨文的/()row_number()的功能实现