2017-08-26 17 views
0

私は1つの列がDATEで、他の列がSIGNALであるMySQL DBを持っています。今度は、SUM over Signalをそれぞれ4日間計算したいと思います。どのようにすべての日付に4daysバケットの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 

多かれ少なかれalgoはdaysグループ内で可変である必要があります。 4は単なる例ではありません。

MySQLでこれを実行する方法を私にアドバイスできますか?

私はここでこれを見つけましたgroup by with count、これは私の問題に役立つかもしれませんか? ありがとう

編集:重要なメモ:私の日付範囲にはギャップがあります。下の図の列数(DISTINCT(TradeDate))にこれが表示されます。私はギャップがないときは常に4になるはずです。しかし、私はギャップがあります。しかし、降順の日付を並べ替えるときは、いつも一緒に日付をグループ化したいと思っています。グループ1:2017-08-22 + 2017-08-21 + 2017-08-20 + 2017-08-19、グループ2:2017-08-18 + 2017-08-17 + 2017-08-15 + 2017-08- 14、...

多分、私はdecending daterangesをdecending integer autoincrement numberにマップすることができました。数1 =「2017年8月17日」数2 =「2017年8月15日」というように。..

EDIT2:私はこのクエリと私のテーブルから結果を見るように :私は私が持っているかもしれませんダブルエントリー1つの同じ日付。どのようにしてこの日付を区別することができますか?

 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何かする必要があります。何かは4日ごとに変わるはずです。 1日でグループ化することから始めてみましょう:あなたはDATETIMEまたは何か他のものではなく、前述のように

SELECT SUM(signal) 
FROM tableName 
GROUP BY date 

dateは本当に、タイプDATEでなければなりません。 DATE(date)を使用して、他の日付タイプを日付に変換することができます。あなたは、このような用語を追加できることを制御したい場合、これは、4日間のarbitaryグループを作成することを

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

注:では

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

あなたのすばらしい解決策にもう一度質問してください。多分、私たちがIDまたは日付で注文する場所を選択し、常に対応する4日間の日付を取ることができます。私が何を意味するのか理解できますか? –

+0

4つの連続した日付でグループ化する場合は、日付ごとに行が1つしかなく、IDが順番に自動増加する場合は、 'TO_DAYS(date)'を 'id'で置き換えるだけで、 。それ以外の場合は、もっと複雑になります。これは現在の質問とは明らかに異なるので、新しい質問をする必要があります。 –

+0

私の答えでそれをしたように私の仮定を確認していただきありがとうございます。あなたは大きな助けとなりました –

0

今、私たちは4日付でグループに必要その間及び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を使用 を。だから私はそれを管理することができた - たとえ私がtradedate範囲に隙間があっても、tmpテーブルのidは隙間がない。そしてこれで私はDIV 4を行い、常に対応する4つの日付を一緒に得ることができます。 enter image description here

関連する問題