mysql - 使用 MySQL 计算时间线的变化

标签 mysql

我是 MySQL 的新手,我需要你的帮助。我有一个包含类似数据的表

---------------------------------------------------
|RobotPosX|RobotPosY|RobotPosDir|RobotShortestPath|
---------------------------------------------------
|0.1      |   0.2   |      15   |       1456      |
|0.2      |   0.3   |      30   |       1456      |
|0.54     |   0.67  |      15   |       1456      |
|0.68     |   0.98  |      22   |       1234      |
|0.36     |   0.65  |      45   |       1234      |
|0.65     |   0.57  |      68   |       1456      |
|0.65     |   0.57  |      68   |       2556      |
|0.79     |   0.86  |      90   |       1456      |                 
---------------------------------------------------

如您所见,RobotShortestPath 列中有重复的值,但它们很重要。每个数字代表一个特定的任务。如果数字连续重复(例如:1456),则表示机器人正在执行该任务,当数字发生变化时(例如:1234),则表示它已切换到另一个任务。如果之前的数字(例如:1456)再次出现,这也意味着机器人在完成之前的任务(1234)后正在执行新任务(1456)。

所以我被卡住的地方是我无法执行任何任务。我从我的最少知识中使用了一些东西,比如 COUNT、GROUP BY,但似乎没有任何效果。

这里执行的任务数实际上是 5 个,但无论我做什么,结果都只有 3 个。

最佳答案

SET @last_task = 0;
SELECT SUM(new_task) AS tasks_performed
FROM (
  SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
    @last_task := RobotShortestPath
  FROM table
  ORDER BY ??
) AS tmp

多表更新
从数据库结构 normailization 的角度来看,你最好使用一个表,并有一个文件来标识什么列是什么机器人,如果由于某种原因这不可行,你可以通过合并表来获得它:

SET @last_task = 0;
SELECT robot_id, SUM(new_task) AS tasks_performed
FROM (
  SELECT 
    IF(@last_task = RobotShortestPath, 0, 1) AS new_task,
    @last_task := RobotShortestPath
  FROM (
    SELECT 1 AS robot_id, robot_log_1.* FROM robot_log_1
    UNION SELECT 2, robot_log_2.* FROM robot_log_2
    UNION SELECT 3, robot_log_3.* FROM robot_log_3
    UNION SELECT 4, robot_log_4.* FROM robot_log_4
    UNION SELECT 5, robot_log_5.* FROM robot_log_5
  ) as robot_log
  ORDER BY robot_id, robot_log_id
) AS robot_log_history
GROUP BY robot_id
ORDER BY tasks_performed DESC

关于mysql - 使用 MySQL 计算时间线的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11576929/

相关文章:

mysql - MySQL 中的 ROW_NUMBER()

php - 仅当用户名与创建条目 PDO 的用户相同时才更新表中的条目

mysql - Yii2 - 使用 LONGBLOB 字段创建迁移

php - 在 SQL 中使用 LIKE 运算符时合并字段

mysql - 如何使用第二个表中的数据更新一个表

php - 如何在 codeigniter 事件记录中选择 MONTH() 和 YEAR()

Java - Spring Boot - Mysql/Java - 从表的列中获取车辆类型并从另一个表中获取其总计数(数量)

php - 不同的表字段标签

php - mysql查询安全限制

python - for 循环中嵌入的 SELECT 查询与 WHERE id IN 语法之间的区别