2012-07-20 10 views
6

Jestem nowym użytkownikiem MySQL i potrzebuję Twojej pomocy. Mam tabeli z podobnymi danymiZliczanie zmian na osi czasu za pomocą 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  |     
--------------------------------------------------- 

Jak widać nie powtarzają się wartości w kolumnie RobotShortestPath, ale są one ważne. Każda liczba reprezentuje określone zadanie. Jeśli liczba powtórzy się kolejno (np. 1456), oznacza to, że robot wykonuje to zadanie, a kiedy liczba się zmienia (np. 1234), oznacza to, że przeszła na inne zadanie. A jeśli poprzedni numer (np. 1456) pojawi się ponownie, oznacza to również, że robot wykonuje nowe zadanie (1456) po wykonaniu wcześniejszego zadania (1234).

Więc gdzie utknąłem, nie mogę wykonać żadnych zadań. Użyłem kilku rzeczy z mojej minimalnej wiedzy, takich jak COUNT, GROUP BY, ale nic nie działa.

Tutaj liczba wykonanych zadań wynosi 5, ale cokolwiek robię, otrzymam tylko 3 jako wynik.

+0

próbowałeś 'SELECT COUNT (*) FROM tablename'? – dunc

+1

Jaki jest wynik wyniku, który chcesz? –

+0

Dzięki za komentarz. Ale to by zwróciło całkowitą liczbę wpisów w tabeli. –

Odpowiedz

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 

Aktualizacja dla wielu tabel
Z strcture bazie widzenia normailization, twój lepiej z jednej tabeli i mają złożony identifing co kolumna jest co robota, jeśli nie posible z jakiegoś powodu, można się, że przez Unię tabele:

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

Witaj Puggan, to nie zwraca wyniku. Dziękuję Ci!!! –

+0

Brak wyników? Próbowałem go na http://sqlfiddle.com/#!2/e80f5/3, ale otrzymałem 4 insted z 5, hmm, ale jeśli uruchamiam http://sqlfiddle.com/#!2/e80f5/4 thers 5 wiersze z new_task = 1 –

+0

Wypróbowałeś moje rozwiązanie? – Madhivanan

0

Jak rozumieć, trzeba śledzić kiedy RobotShortestPath zostanie zmieniona na inną wartość. Aby to osiągnąć można użyć trigger takiego:

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

Witaj Timur, ale jak mogę uzyskać wynik, tj. całkowity brak zadań ??? Dziękujemy! –

+0

@BommareddyChaitanyaKrishna wynik zostanie zapisany w innej tabeli. Zobacz instrukcję 'UPDATE'. – Timur

+0

Pojawia się następujący komunikat o błędzie: Błąd SQL (1235): Ta wersja MySQL nie obsługuje jeszcze "wielu wyzwalaczy z tym samym czasem działania i zdarzeniem dla jednej tabeli" */ –

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

Dziękuję Madhivanan za pomoc! –

+0

Witaj Madhavinan, problem był z HeidiSql, Twoje zapytanie zwraca doskonały wynik w środowisku roboczym MySQL. Dziękuję Ci bardzo!!! –

0

spróbuj wykonać następujące zapytanie:

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

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

SELECT @cnt AS count; 
+0

Dziękuję Omesh za pomoc !! Ale to nie działa. –

+0

Testowałem to na MySQL 5.5 i jego działanie było doskonałe. Sprawdź testowanie tego samego zapytania z innego narzędzia. – Omesh

Powiązane problemy