2014-01-15 21 views
1

基本上我試圖從表中添加一些字段並重現另一張表,但沒有運氣。MYSQL在給定的時間戳列內求和的字段

初始表看起來像;

ID STATUS  Min  Max  Mean TimeStamp 
1 Motor1-ON  10  20  15  12/01/2013 05:00 
2 Motor1-OFF  5  7   6  12/01/2013 05:00 
3 Motor1- HOLD 1  3   2  12/01/2013 05:00 
4 Motor2-ON  8  12  10  12/01/2013 05:00 
5 Motor2-OFF  4  6   5  12/01/2013 05:00 
6 Motor2-HOLD 1  5   3  12/01/2013 05:00 

7 Motor1-ON  11  21  16  12/01/2013 05:10 
8 Motor1-OFF  5  7   6  12/01/2013 05:10 
9 Motor1- HOLD 1  3   2  12/01/2013 05:10 
10 Motor2-ON  9  10  9.5 12/01/2013 05:10 
11 Motor2-OFF  5  7   6  12/01/2013 05:10 
12 Motor2-HOLD 1  5   3  12/01/2013 05:10 
.  .   .  .   .   . 
.  .   .  .   .   . 
.  .   .  .   .   . 

狀態爲兩種類型給出:電機1和電機2爲每10分鐘增加一個時間戳。 我試圖創建一個基於第一個表的新表,以便爲每個時間戳添加電機1和電機2的3個狀態。我嘗試實現的表(目前爲止沒有運氣)應該看起來像;

Timestamp  Total_ON Total_ON Total_ON Total_OFF Total_OFF Total_OFF 
        _Min  _Max  _Mean  _Min  _Max   _Mean 

12/01/2013 05:00  18  32   35   9   13   11 
12/01/2013 05:10  20  31   25.5   10   14   12 
    .     .    .     .   .    . 
    .     .    .     .   .    . 

(表繼續到包括Total_Hold_Min,Total_Hold_Max,Total_Hold_Mean)

Total_ON_Min = Motor 1_ON Min + Motor 2_ON Min (For its given Timestamp) 

Total_ON_Max = Motor1_ON Max + Motor2_OFF Max (For its given Timestamp) 

Total_ON_Mean = Motor1_ON Mean + Motor2_OFF Mean (For its given Timestamp) 

等等...。

任何人都可以提供任何建議正確的mysql語句,我應該看着實現這一點。我一直試圖實現CrossTab沒有成功。使用選擇語句和總計函數分別計算馬達1和馬達2的單獨總計是沒有問題的,但在每個時間戳內添加兩個字段我沒有成功

任何想法或相關鏈接大加讚賞,因爲我試圖建立在我的知識基礎

我是新來的mysql

感謝

附加信息:

電機狀態是非常獨立和靜態的,所以我不能分解它。數據透視表失去了我需要指出的靈活性。我提出了一個基於給定想法的解決方案,該解決方案適用於總共Min。

SELECT 

`timestamp`, 

status, 

SUM(Min) AS `Total_ON_MIN` FROM Tablename where Status IN('Motor1_on','Motor2_on') 
FROM table 

GROUP BY `timestamp` 

我就用這個方法通過時間戳「Total_Max_ON」等帶來隨着錯誤的集團雖然未能達到。

SELECT 
    `timestamp`, 
    status, 

(SELECT SUM(Min) AS `Total_ON_MIN` FROM Tablename where Status IN('Motor1_on','Motor2_on')), 

(SELECT SUM(Max) AS `Total_ON_MAX` FROM Tablename where Status IN('Motor1_on','Motor2_on')), 

(SELECT SUM(Mean) AS `Total_ON_MEAN` FROM Tablename where Status IN('Motor1_on','Motor2_on')) 

GROUP BY `timestamp` 

任何想法用於進一步direction.Cheers

+0

搜尋有關如何轉動在MySQL數據,然後一展身手的詳細信息;如果卡住了,請回來尋求幫助。 – eggyal

+0

感謝您的指針。我會挖掘數據透視數據,看看它發生了什麼。 – Tino88

回答

0

你應當認真考慮拆分馬達標識符(即電機1,電動機2)和狀態指示器(開/關/保持)成兩個獨立的字段。

然後,您可以方便地查詢像

SELECT 
    `timestamp`, 
    SUM(CASE WHEN status = 'ON' THEN Min ELSE 0 END CASE) AS `ON_Min`, 
    SUM(CASE WHEN status = 'ON' THEN Max ELSE 0 END CASE) AS `ON_Max`, 
    SUM(CASE WHEN status = 'ON' THEN Mean ELSE 0 END CASE) AS `ON_Mean`, 
    SUM(CASE WHEN status = 'OFF' THEN Min ELSE 0 END CASE) AS `OFF_Min`, 
    SUM(CASE WHEN status = 'OFF' THEN Max ELSE 0 END CASE) AS `OFF_Max`, 
    SUM(CASE WHEN status = 'OFF' THEN Mean ELSE 0 END CASE) AS `OFF_Mean` 
FROM table 
GROUP BY `timestamp` 
ORDER BY `timestamp` ASC 

或者如果你真的不需要一個支點,你可以做

SELECT 
    `timestamp`, 
    status, 
    SUM(Min) AS `Min_Sum`, 
    SUM(Max) AS `Max_Sum`, 
    SUM(Mean) AS `Mean_Sum` 
FROM table 
GROUP BY `timestamp`, status 
ORDER BY `timestamp` ASC, status ASC 

,或者需要由電機打破

SELECT 
    `timestamp`, 
    motor, 
    status, 
    SUM(Min) AS `Min_Sum`, 
    SUM(Max) AS `Max_Sum`, 
    SUM(Mean) AS `Mean_Sum` 
FROM table 
GROUP BY `timestamp`, motor, status 
ORDER BY `timestamp` ASC, motor ASC, status ASC 

如果你分解電機和狀態,你會看到更多的靈活性來查詢。

如果你絕對不能拆散的狀態進入電機和狀態,那麼我會做到以下幾點:

SELECT 
    `timestamp`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Min ELSE 0 END CASE) AS `ON_Min`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Max ELSE 0 END CASE) AS `ON_Max`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Mean ELSE 0 END CASE) AS `ON_Mean`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Min ELSE 0 END CASE) AS `OFF_Min`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Max ELSE 0 END CASE) AS `OFF_Max`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Mean ELSE 0 END CASE) AS `OFF_Mean` 
FROM table 
GROUP BY `timestamp` 
ORDER BY `timestamp` ASC 
+0

感謝您的信息。電機狀態幾乎不能被分解。我根據您的想法Mike發佈了有關零件解決方案的其他信息。儘管如此,我還沒有完成。任何進一步的方向感激。 – Tino88

+0

@ Tino88在我的答案中查看更新。 –

+0

乾杯。這樣做更有意義。按預期工作。感謝您的意見。 – Tino88