2017-08-26 76 views
0

我有一個MySQL DB,其中一列是DATE,另一列是信號。現在我想計算每個4天的信號總和。如何計算所有日期4天桶中的SUM

f.e.

SUM(signal over DATE1,DATE2,DATE3,DATE4) 
    SUM(signal over DATE5,DATE6,DATE7,DATE8) 
    ... 

    whereas Date_N = successor of DATE_N-1 but need not to be the day before 

毫無疑問,算法應該在天組中變化。 4 ist只是一個例子。

任何人都可以給我一個建議如何在MySQL中執行此操作嗎?

我在這裏找到了這裏group by with count,這可能對我的問題有幫助嗎? 謝謝

編輯:一個重要說明:我的日期範圍有差距。您可以在下圖中的列數(DISTINCT(TradeDate))中看到這一點。當我沒有空白時,它應該總是4。但我確實有差距。但是,當我將日期降序排序時,我想將這些日期分組在一起,總是4天,f.e. Group1:2017-08-22 + 2017-08-21 + 2017-08-20 + 2017-08-19,Group2:2017-08-18 + 2017-08-17 + 2017-08-15 + 2017-08- 14,...

也許我可以將縮減的日期範圍映射到一個正在減少的整數自動增加數,然後我會有一個沒有間隙的數字。數1 =「2017年8月17日」號2 =「2017年8月15日」等等..

EDIT2: 當我看到從我與此查詢表的結果:我可能我有兩個條目爲同一個日期。我如何區分這個日期 - 只有一個reprensentative?

 SELECT SUM(CondN1),count(id),count(DISTINCT(TradeDate)),min(TradeDate),max(TradeDate) ,min(TO_DAYS(DATE(TradeDate))),id FROM marketstat where Stockplace like '%' GROUP BY TO_DAYS(DATE(TradeDate)) DIV 4 order by TO_DAYS(DATE(TradeDate)) 

Result of my Table

+0

https://stackoverflow.com/a/13780140/747609可能會指導您 – IROEGBU

+0

向我們顯示一些數據。什麼是'DATE1'? –

+0

@IROEGBU謝謝!這正是我所期待的! –

回答

2

SUM()是一組功能,所以你需要GROUP BY東西。每四天應該改變一次。讓我們開始通過分組以一天:

SELECT SUM(signal) 
FROM tableName 
GROUP BY date 

date真正應該DATE型的,就像你提到的,不會DATETIME或其他任何東西。您可以使用DATE(date)將其他日期類型轉換爲日期。現在,我們需要組由四個日期:

SELECT SUM(signal) 
FROM tableName 
GROUP BY TO_DAYS(date) DIV 4 

注意,這將創造的四天arbitary組,如果你想控制,您可以添加一個術語是這樣的:

SELECT SUM(signal) 
FROM tableName 
GROUP BY (TO_DAYS(date)+2) DIV 4 
+0

對你的優秀解決方案還有一個問題:我沒有全部的日期,我的日期範圍有了飛躍。也許我們可以根據ID或日期進行選擇,並始終採用相應的4天日期。你能明白我的意思嗎? –

+0

如果你只是想按照四個連續的日期分組,你只有一個日期的行,而你的id是連續的和自動增加的,那麼你可以簡單地用'id'替換'TO_DAYS(date)'來實現你想要的。在所有其他情況下,它將變得更加複雜。由於這與你目前的問題明顯不同,你應該問一個新問題。 –

+0

感謝您驗證我的假設,就像我在答案中所做的一樣。你是一個很好的幫助 –

0

在同時與KIKO的幫助下,我已經找到了解決辦法: 我做一個臨時表與

CREATE TEMPORARY TABLE if not EXISTS tradedatemaptmp (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) SELECT Tradedate AS Tradedate, CondN1, CondN2 FROM marketstat WHERE marketstat.Stockplace like 'US' GROUP BY TradeDate ORDER BY TradeDate asc; 

和使用,而不是源於tradedate在臨時表中現已創建ID。所以我可以管理 - 即使我在交易範圍內有空白時,tmp表中的id也沒有空白。通過這個,我可以將DIV 4和相應的4個日期放在一起。 enter image description here