6

私は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)、別のタスクに切り替えたことを意味します。また、前の番号(ex:1456)が再び表示された場合は、ロボットが以前のタスク(1234)を実行した後、新しいタスク(1456)を実行していることも意味します。

ですから、私が立ち往生しているのは、実行されるタスクをまったく取得できないことです。COUNT、GROUP BYなど、最低限の知識からいくつかのものを使用しましたが、何も機能していないようです。

ここで実行されるタスクの数は実際には5つですが、私が何をしても、結果として3つしか得られません。

4

4 に答える 4

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

複数のテーブルの更新
データベース構造の正規化ビューから、1つのテーブルを使用して、どの列がどのロボットであるかを特定するファイルを作成します。何らかの理由でそれが不可能な場合は、テーブルを結合することで取得できます。

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
于 2012-07-20T09:55:20.757 に答える
0

RobotShortestPath私が理解したように、いつが別の値に変更されたかを追跡する必要があります。これを実現するには、次のようなトリガーを使用できます。

delimiter |

CREATE TRIGGER track AFTER UPDATE ON yourtable
  FOR EACH ROW BEGIN
    IF NEW.RobotShortestPath != OLD.RobotShortestPath THEN
      UPDATE tracktable SET counter=counter+1 WHERE tracker=1;
    END IF;
  END;
|

delimeter ;
于 2012-07-20T09:57:20.600 に答える
0
set @n:=0, @i:=0;
select max(sno) from
(
select @n:=case when @i=RobotShortestPath then @n else @n+1 end as sno, 
@i:=RobotShortestPath as dno
from table 
) as t;
于 2012-07-20T09:59:10.507 に答える
0

次のクエリを試してください。

SET @cnt = 0, @r = -1;

SELECT IF(armed <> @r, @cnt:= @cnt + 1, 0), @r:= RobotShortestPath, @cnt FROM table;

SELECT @cnt AS count;
于 2012-07-20T09:59:39.600 に答える