实现前后行相减的SQL该如何写?有两种方法!

本文介绍了在SQL中实现前后行数值相减的两种方法,包括使用子查询和通过LEFT/RIGHT JOIN操作。以用户登录时长计算和订单ID连续性检查为例,详细解释了每种方法的适用场景和注意事项,提醒在处理字符串类型字段时要注意索引的使用。
摘要由CSDN通过智能技术生成

背景

有时会有这样一种查询场景,需要对查询结果前后行操作,比如后一行减前一行。
比如有一张用户登录表,有登入和登出两行,需要相减简单计算在线时长。或者一张订单表,需要计算后一行的订单id和前一行的订单id差多少(假设订单号是单调递增的)。

针对这类场景,SQL语句改如何写呢?

表结构和数据构造

以统计前后行的订单号是否连续为例,
表结构:

CREATE TABLE `t_test3` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `order_id` int(11) DEFAULT '0' COMMENT '订单号',
  PRIMARY KEY (`id`),
  key (`order_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='';

插入测试数据:

insert into t_test3(order_id) values(1),(2),(3),(5),(6),(4),(2);

第一种写法:select 子查询

找order_id-1行,如果没有,说明不存在order_id-1的order_id

mysql>select *, (select t1.order_id-order_id from t_test3 w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值