请用sql把左边转换为右表,新增c列,当B列数据变化时C列重新计算

原题目

在这里插入图片描述

答题

楼主选用的mysql数据库来做这题,创建题目所需表及数据

CREATE TABLE `t_test_3`  (
  `A` int(11) ,
  `B` int(11) 
) ;
INSERT INTO `t_test_3` VALUES (1, 1);
INSERT INTO `t_test_3` VALUES (2, 1);
INSERT INTO `t_test_3` VALUES (3, 1);
INSERT INTO `t_test_3` VALUES (4, 1);
INSERT INTO `t_test_3` VALUES (5, 0);
INSERT INTO `t_test_3` VALUES (6, 0);
INSERT INTO `t_test_3` VALUES (7, 0);
INSERT INTO `t_test_3` VALUES (8, 0);
INSERT INTO `t_test_3` VALUES (9, 1);
INSERT INTO `t_test_3` VALUES (10, 1);
INSERT INTO `t_test_3` VALUES (11, 1);
INSERT INTO `t_test_3` VALUES (12, 1);

在这里插入图片描述

1.思路
看题可知
a.下一行B列值与上一行B列值不同时,C列值默认为1;
b.下一行B列值与上一行B列值相同时,C列值在上一行的基础上加1

实现思路
a.在当前行,先拿到下一行的B列值,作为第三列比较列Q3,第一行默认为0
b.再用B列值与Q3列值做比对,相同就在上一行的C列值上加1;不同就默认为1(这里用到了一个累计变量值@total)

2.实现

SELECT
    tmp.Q1 AS A,
    tmp.Q2 AS B,
		CASE WHEN tmp.Q2 = tmp.Q3 THEN @total := @total + 1
		ELSE @total := 1 END as C 
FROM
	(
		select t1.A as Q1, t1.B as Q2, coalesce(t2.B2, 0) as Q3
		from 
		(select A,B,1 as C from t_test_3) t1
		LEFT JOIN 
		(select A + 1 as A2, B as B2 from t_test_3) t2
		ON t1.A = t2.A2 ORDER BY  t1.A asc
	) tmp,
	(SELECT @total := 1) AS T1
ORDER BY
    tmp.Q1;

在这里插入图片描述

3.验证
新增行数据

INSERT INTO `t_test_3` VALUES (13, 2);
INSERT INTO `t_test_3` VALUES (14, 2);
INSERT INTO `t_test_3` VALUES (15, 9);
INSERT INTO `t_test_3` VALUES (16, 1);

结果
在这里插入图片描述
与题目所要结果一样,如果更好的方法或思路,欢迎留言交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值