这里是 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
简而言之,我想按降序获取每个日期列位置的变化。
知道我应该如何处理这个问题吗?
感谢任何帮助。
提前致谢
路易斯
最佳答案
您可以使用子查询。
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 在子查询之外匹配它。
最后,还有没有更早日期的情况。为此,我们只使用记录 where t2.date = t.date。当第一个参数为 null 时,COALESCE 将使用第二个参数,因此在这里很方便。
关于mysql - 计算位置变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42705999/