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
简而言之,我希望按降序排列每个日期列位置的变化。
知道我应该如何处理这个问题吗?
感谢任何帮助。
提前致谢,
路易斯
答案 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