MySQL

2012-07-20 6 views
6

के साथ समयरेखा में परिवर्तनों की गणना करना मैं 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 मिलता है।

+0

आप 'COUNT का चयन करें (*) की कोशिश की है tablename' से? – dunc

+1

आप जो परिणाम चाहते हैं उसका आउटपुट क्या है? –

+0

आपकी टिप्पणी के लिए धन्यवाद। लेकिन वह तालिका में कुल संख्या में प्रविष्टियों को वापस कर देगा। –

उत्तर

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 

कई तालिकाओं
एक डेटाबेस Strcture normailization दृश्य से , एक मेज के साथ की अपनी बेहतर है, और राशि के लिए अद्यतन एक identifing क्या स्तंभ क्या रोबोट, अगर किसी कारण से कि posible नहीं, आप कर सकते हैं है दायर मिल संघ द्वारा कि टेबल:

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

हैलो पगगन, इससे कोई परिणाम नहीं मिलता है। धन्यवाद!!! –

+0

कोई परिणाम नहीं? मैंने इसे http://sqlfiddle.com/#!2/e80f5/3 पर करने की कोशिश की लेकिन मुझे 5 में से 4 इंस्टेंट मिला, हम्म, लेकिन अगर मैं http://sqlfiddle.com/#!2/e80f5/4 thers 5 चलाता हूं new_task = 1 –

+0

के साथ पंक्तियां क्या आपने मेरा समाधान करने की कोशिश की है? – Madhivanan

0

के रूप में मैं समझ गया, आप जब RobotShortestPath एक और मान में बदल जाता है पर नज़र रखने की जरूरत है। प्राप्त करने के लिए इस आप trigger इस तरह उपयोग कर सकते हैं:

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

हैलो तिमुर, लेकिन मैं परिणाम कैसे प्राप्त कर सकता हूं यानी कुल कार्यों का कोई ??? धन्यवाद !!! –

+0

@ बॉम्बेर्डी चैतन्यकृष्ण परिणाम किसी अन्य तालिका में संग्रहीत किया जाएगा। 'अद्यतन' कथन देखें। – Timur

+0

मुझे निम्न त्रुटि मिलती है: एसक्यूएल त्रुटि (1235): MySQL का यह संस्करण अभी तक एक ही क्रिया समय और एक तालिका के लिए ईवेंट के साथ एकाधिक ट्रिगर्स का समर्थन नहीं करता है * * –

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

आपकी मदद के लिए माधिवान धन्यवाद !!! –

+0

हैलो माधविनन, समस्या हेइडीस्कल के साथ थी, आपकी क्वेरी MySQL वर्कबेंच में सही परिणाम देती है। आपका बहुत बहुत धन्यवाद!!! –

0

कोशिश निम्न क्वेरी:

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

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

SELECT @cnt AS count; 
+0

सहायता के लिए ओमेश धन्यवाद !! लेकिन यह काम नहीं लग रहा है। –

+0

मैंने इसे MySQL 5.5 पर परीक्षण किया है और यह सही काम कर रहा है। विभिन्न टूल से एक ही क्वेरी का परीक्षण जांचें। – Omesh