sql实现一条数据与前一条数据的比较

    最近项目中遇到一些数据统计的需求,具体需求就是要统计对于某一列较之前相同id的一条数据变更的数目。描述起来可能相对抽象,我们举一个简单的例子:

    对于一个记录学生分数(student_score)的表,我们要统计每一次考试,有多少学生取得了进步。

student_score

id     name        score      exam_id

1      张三           86             1

2      李四           74             1

3      王五           58             1

4      张三           78             2

5      李四           87             2

6      王五           90             2

7      张三           89             3

8      李四           87             3

9      王五           89             3

    我们想要的到的结果是:

exam_id    count

     2             2

     3             1

    其中exam_id为2的两条记录为:

5      李四           87             2

6      王五           90             2

    exam_id为3的一条记录为:

7      张三           89             3

    这个问题看上去相对比较复杂,我们需要去对比每个学生每一次考试与他前一次考试的比分,然后进行统计,因此基于以上问题我们先考虑我们需要找出学生每次的考试id与他对应的前一次考试的id。当这个考虑过程中,当然我们不能仅仅用倍数关系来考虑,因为若我们出现了某位同学中途加入或者某位同学中间辍学了,这样会影响我们的统计,因此我们写如下sql:

SELECT currentscore.id AS currentid,  
	MAX(beforescore.id) AS beforemaxid
	FROM student_score currentscore 
	INNER JOIN student_score beforescore 
		ON currentscore.name = beforescore.name 
	WHERE beforescore.id < currentscore.id

    如上sql我们可以实现查找每一个id对应的前一次操作的id,然后我们通过对比着两次id之间的不同来进行统计,最终得到如下sql

SELECT exam_id, 
	COUNT(id) 
	FROM student_score a 
	RIGHT JOIN  (
		SELECT currentscore.id AS currentid,  
			MAX(beforescore.id) AS beforemaxid
		FROM student_score currentscore 
		INNER JOIN student_score beforescore 
		ON currentscore.name = beforescore.name 
		WHERE beforescore.id < currentscore.id
	) b 
	ON a.id = b.currentid
	LEFT JOIN student_score c
	ON b.beforemaxid = c.id
	WHERE a.score > c.score
	GROUP BY exam_id
    这里主要讲了一下面临的问题,以及思考的过程,欢迎大家来批评指正,或者可以有更好的实现方案。



  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值