计算位置变化

时间:2017-03-09 21:42:12

标签: mysql

MySql新手在这里。我会尽力解释我的问题。我在桌子上有以下记录:

Date       | Course                     | Position
-------------------------------------------------     
2017-02-28 | Portuguese Language Course | 24
2017-03-02 | Portuguese Language Course | 23
2017-03-04 | Portuguese Language Course | 24
2017-03-08 | Portuguese Language Course | 26

我正在努力解决以下问题:

Date       | Course                     | Position | Variation
---------------------------------------------------|----------     
2017-03-08 | Portuguese Language Course | 26       | +2
2017-03-04 | Portuguese Language Course | 24       | +1
2017-03-02 | Portuguese Language Course | 23       | -1
2017-02-28 | Portuguese Language Course | 24       | 0

简而言之,我希望按降序排列每个日期列位置的变化。

知道我应该如何处理这个问题吗?

感谢任何帮助。

提前致谢,

路易斯

2 个答案:

答案 0 :(得分:1)

您可以使用子查询。

SELECT t.*, t.position - t2.position as variation
FROM courses t, courses t2
WHERE t2.course = t.course
  AND t2.date = COALESCE((SELECT MAX(t3.date)
                 FROM courses t3
                 WHERE t3.course = t.course
                 AND t3.date < t.date), t.date)
ORDER BY t.date DESC

这将以1行到1行为基础连接表格 对于t中的每一行,我们将它与t2中的单行配对,这是t.date之前的最新行。

要做到这一点,我们必须获得最大日期,我们在子查询中执行此操作。但是该子查询无法告诉我们哪个位置与该日期相关联,因此我们使用t2在子查询之外匹配它。

最后,还有没有早期日期的情况。为此,我们只使用t2.date = t.date的记录。当第一个参数为空时,COALESCE将使用第二个参数,因此在这里很方便。

答案 1 :(得分:0)

您可以在子查询中选择起始值,并使用所选的参考值计算其余值。

select date, course, c.position,c.position-a.position variation from courses c, (select position from courses order by date asc limit 1) a

这是sqlfiddle