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

阅读: 评论:0

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

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 beforemaxidFROM 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 beforemaxidFROM student_score currentscore INNER JOIN student_score beforescore ON currentscore.name = beforescore.name WHERE beforescore.id < currentscore.id) b ON a.id = b.currentidLEFT JOIN student_score cON b.beforemaxid = c.idWHERE a.score > c.scoreGROUP BY exam_id
    这里主要讲了一下面临的问题,以及思考的过程,欢迎大家来批评指正,或者可以有更好的实现方案。



本文发布于:2024-01-30 03:29:34,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170655657618917.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   sql
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23