Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅获取上一个连续年份的行_Mysql_Sql_Mysql Workbench - Fatal编程技术网

Mysql 仅获取上一个连续年份的行

Mysql 仅获取上一个连续年份的行,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我有一个基本表,如下所示: 我的目标是获得每个课程名称和年份的比率与前一个连续年份相同课程名称的比率之间的差异 例如: course_name = hedva1 year = 2016 我希望得到: course_name = hedva1 year = 2016 rate = 9.50000 - 4.0000 = 5.50000 course_name = hedva1 year = 2015 rate = 4.0000 - 2.0000 = 2.0000 以及: course_name

我有一个基本表,如下所示:

我的目标是获得每个课程名称和年份的比率与前一个连续年份相同课程名称的比率之间的差异

例如:

course_name = hedva1
year = 2016
我希望得到:

course_name = hedva1
year = 2016
rate = 9.50000 - 4.0000 = 5.50000
course_name = hedva1
year = 2015
rate = 4.0000 - 2.0000 = 2.0000
以及:

course_name = hedva1
year = 2015
我希望得到:

course_name = hedva1
year = 2016
rate = 9.50000 - 4.0000 = 5.50000
course_name = hedva1
year = 2015
rate = 4.0000 - 2.0000 = 2.0000
我的第一个合乎逻辑的步骤是将表格与表格交叉,这让我明白:

现在我正试图用不同的WHERE's得到具体的结果,但却无法理解


对于之前没有任何连续年份的行,只需显示nothing即可。

获取上一个值的一种方法是关联子查询:

select t.*,
       (select t2.rate_avg
        from t t2
        where t2.course = t.course and t2.year < t.year
        order by t2.year desc
        limit 1
       ) as prev_rate_avg
from t;

答案的其余部分只是算术。

你不必交叉加入,因为你已经知道要加入的候选人记录:相同的课程名称,较小的年份。因此,按发现的旧年份排序的内部联接,将结果限制为一行

select
  ynow.course_name,
  ynow.year,
  ynow.rate_avg,
  yold.year,
  yold.rate_avg,
  ynow.rate_avg - yold.rate_avg as rate
from mytable ynow
join mytable yold where yold.course_name = ynow.course_name and yold.year < ynow.year
where ynow.course_name = 'hedva1'
  and ynow.year = 2016
order by yold.year desc
limit 1;

这很酷,谢谢,我要澄清一下:我不知道我会连续几年,比如2016年和2015年。我可能会得到像2016年和2012年这样的值,然后我需要2016年和上一次课程在表中的时间之间的差异,所以它将是:2016年[rate]-2012年[rate]有意义吗?Thanks@yoni . . . 这就是这个查询的作用。