2012-07-20 28 views
6

Soy nuevo en MySQL y necesito su ayuda. Tengo una tabla con datos similaresContando los cambios en la línea de tiempo con 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  |     
--------------------------------------------------- 

Como se puede ver hay valores repetidos en la columna RobotShortestPath, pero son importantes. Cada número representa una tarea específica. Si el número se repite consecutivamente (ej .: 1456), significa que Robot está realizando esa tarea, y cuando el número cambia (por ejemplo, 1234) significa que ha cambiado a otra tarea. Y si el número anterior (por ejemplo, 1456) aparece nuevamente, también significa que el robot está realizando una nueva tarea (1456) después de realizar la tarea anterior (1234).

Entonces, donde estoy atascado, no puedo obtener ninguna de las tareas realizadas. He usado varias cosas de mi conocimiento mínimo como COUNT, GROUP BY pero nada parece funcionar.

Aquí el n. ° de tareas realizadas son 5 en realidad, pero haga lo que haga, obtengo solo 3 como resultado.

+0

¿Has probado 'SELECT COUNT (*) A partir de tablename'? – dunc

+1

¿Cuál es el resultado del resultado que desea? –

+0

Gracias por su comentario. Pero eso devolvería el número total de entradas en la tabla. –

Respuesta

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 

Actualización para varias tablas
Desde un punto de vista normailization strcture base de datos, su mejor con una mesa, y tienen un presentadas identificando lo que la columna es lo robot, si eso no alcance por alguna razón, se puede conseguir que la unión de las tablas:

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 
+0

Hola Puggan, esto no arroja ningún resultado. ¡¡¡Gracias!!! –

+0

sin resultado? Lo intenté en http://sqlfiddle.com/#!2/e80f5/3 pero obtengo 4 en 5, hmm, pero si ejecuto http://sqlfiddle.com/#!2/e80f5/4 thers 5 filas con new_task = 1 –

+0

¿Has probado mi solución? – Madhivanan

0

según entendí, es necesario realizar un seguimiento cuando RobotShortestPath se cambia a otro valor. Para lograr esto se puede usar trigger así:

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 ; 
+0

Hola Timur, pero ¿cómo podría obtener un resultado, es decir, el número total de tareas? Gracias !!! –

+0

El resultado de @BommareddyChaitanyaKrishna se almacenará en otra tabla. Ver la declaración 'UPDATE'. – Timur

+0

Recibo el siguiente error: Error de SQL (1235): esta versión de MySQL aún no admite 'múltiples activadores con el mismo tiempo de acción y evento para una tabla' */ –

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; 
+0

¡Gracias Madhivanan por tu ayuda! –

+0

Hola Madhavinan, el problema fue con HeidiSql. Su consulta arroja un resultado perfecto en el entorno de trabajo MySQL. ¡¡¡Muchas gracias!!! –

0

Try siguiente consulta:

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

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

SELECT @cnt AS count; 
+0

Gracias Omesh por ayuda !! Pero esto no parece funcionar. –

+0

Lo he probado en MySQL 5.5 y funciona perfectamente. Verifique la misma consulta desde otra herramienta. – Omesh

Cuestiones relacionadas