mysql - 计算位置变化

标签 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

简而言之,我想按降序获取每个日期列位置的变化。

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

感谢任何帮助。

提前致谢

路易斯

最佳答案

您可以使用子查询。

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/

相关文章:

python - 重试失败的 sqlalchemy 查询

php - 用户@localhost已经存在。无法为第二个数据库创建测试用户

mysql - 插入选择 mariadb 查询

php - 检查MySQL数据库是否使用MD5哈希更新

php - 不工作要求

mysql - Group by 也是 order by?

php - 存储 PHP 应用程序设置的最佳方式?

android - 如何将 SQLite 数据库从 Android 复制到 MySQL 数据库(复制/同步)

mysql - 如何从 MySQL 中 PK 最低的第二个 tbl 中选择 2 个 tbl 但只有 1 行?

mysql - Docker MySQL连接DBeaver