2011-07-26 4 views
2

は、timestamp列を持つテーブル、例えば考える:

(1)A:MySQLタイムスタンプの範囲で行を合計するにはどうすればよいですか?

timestamp   | id | value 
    -------------------------------------- 
    2001-01-01 00:00:00 | 1 | 3 
    2001-01-01 00:00:00 | 2 | 5 
    -------------------------------------- 
    2001-01-02 00:00:00 | 1 | 6 
    2001-01-02 00:00:00 | 2 | 10 
    2001-01-02 00:00:00 | 3 | 7 
    -------------------------------------- 
    2001-01-03 00:00:00 | 3 | 14 
    2001-01-03 00:00:00 | 2 | 15 
    -------------------------------------- 
    2001-01-03 00:00:00 | 1 | 9 
    2001-01-03 00:00:00 | 2 | 20 

と与えられた集約レベルを、私は結果以上(合計)集計したい2日を言います上記の例では、与えられたAGGレベルの移動ウィンドウです:2001-01-01〜2001-01-02,2001-01-02〜2001-01-03、2001-01-03〜2001-01-04

timestamp_1   | timestamp_2   | id | agg_value 
    ----------------------------------------------------------- 
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 1 | 9 (=3+6) 
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 2 | 15 (=5+10) 
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 3 | 7 (=7) 
    ----------------------------------------------------------- 
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 1 | 6 (=6) 
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 2 | 25 (=10+15) 
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 3 | 21 (=7+14) 
    ----------------------------------------------------------- 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 1 | 9 (=9) 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 2 | 35 (=15+20) 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 3 | 14 (=14) 

(2)上記の範囲内で重複しない除算を行います。例:2001-01-01もたらされる、2001年1月3日2001年1月4日に、2001年1月2日までに:

timestamp_1   | timestamp_2   | id | agg_value 
    ----------------------------------------------------------- 

    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 1 | 9 (=3+6) 
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 2 | 15 (=5+10) 
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 3 | 7 (=7) 
    ----------------------------------------------------------- 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 1 | 9 (=9) 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 2 | 35 (=15+20) 
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 3 | 14 (=14) 

(のような基本的には(1)オーバーラップなし)

ありがとうございます!


編集:溶液を添加

私は、少なくとも用溶液(1):

SELECT t1.timestamp AS timestamp1, 
    MAX(t2.timestamp) AS timestamp2, t1.id, 
    SUM(t2.value) AS agg_value 
    FROM my_table t1 
    LEFT JOIN my_table t2 ON 
    (t2.timestamp >= t1.timestamp AND 
    t2.timestamp <= ADDDATE(t1.timestamp,INTERVAL 2 DAY) AND 
    t2.id = t1.id) 
    GROUP BY t1.timestamp, t1.id 

(2)は、おそらくのサブセットにフィルタリングすることができるためのソリューション上記。

+0

相関サブクエリを使用します。 –

+1

はすべてテーブルに入る予定ですか?ギャップの可能性はありますか?すなわちtimestamp_1には1/1/2001、1/2/2001、1/3/2001、1/6/2001が含まれています...あなたはまだ1/4-1/5合計が必要でしょうか? –

+0

すべての日付がテーブルにあるわけではありません。たとえば、あなたが与えた例では、1/4-1/5合計には関心がありません。 – Ariel

答えて

0

これは、日付部分を取得し、日付差を取得し、日差でグループ化することにより、X日ごとにグループ化します。これは

select 
     CEILING(datediff(date(now()), date(myTimeStamp))/2) DaysDiff, 
     ID, 
     min(date(myTimeStamp)) as FirstDateInGroup, 
     max(date(myTimeStamp)) as LastDateInGroup, 
     sum(value) as SumVal 
    FROM TimeSample 
    group by DaysDiff, ID 
    order by FirstDateInGroup, ID 

EDITあなたの#2ソリューションを取得します---- PERので、これはありません...あなたのサンプルは2日間処理する方法を示していた

コメント。 「now()」は、データをグループ化するためのベースラインにすぎません。年単位で分割したい場合は、YEAR(YourDateColumn)を基にクエリを実行します。 30日が必要な場合は、30で割るだけです。毎月、私は年(YourDateColumn)と月(YourDateColumn)ごとにグループ化します。固定された "now()"範囲を持つことによって、開始点として数値を返す以外は何もしません。あなたのデータが2歳だった場合、日付の差は365日* 2年= 730日になります... 2で除算し、365のグループ基準で背中を区切ります。あなたが興味を持っている期間。

ここでmyTimeStampは '2011-01-01'と '2011-06-30'の間で今年の最初の6ヶ月間を取得しています...これはあなたのDaysDiffグルーピング208日/ 2 = 104.

グループを作成する際に気になる他のベースライン値がある場合は、now()を「2011-01-01」のように変更するだけで済みます。 2011年1月1日に基づいています。そのうち、これは何もしませんが、DaysDiffを負の値でゼロまで計算し、次に正の値に戻します。

+0

それは良いです!ありがとう!あなたのソリューションと – Ariel

+0

一つの問題しかし、基準点は、レンジの下限タイムスタンプは現在、()とではありませんので、私は持っている場合:
2010-01-01
2010-07-01
2010-08- 01
2010-12-01
2011-03-01
2011-05-01
と集約レベルは** ** 1年に設定されており、今()私は、2011年7月27日です部門を取得します:
2010-01-01 - 2010-07-01
2010-08-01 - 2011-05-01
の代わりに: 2010-01-01 - 2010-12-01
2011-03-01 - 2011-05-01
この問題を解決するにはどうすればよいですか? – Ariel

+0

解決策の1つの問題ですが、参照ポイントは範囲の下限のタイムスタンプではなくなりました。したがって、次のようになります。 '2010-01-01
-01
2010-08- 01
2010-12-01 2011-03-01
2011-05-01
'
と集約レベルは現在** 1年**と(に設定されている)私は、2011年7月27日です '2010-01-01 - 2010-07-01
2010-08-01 - 2011-05-01
の代わりに ' 2010-01-01 - 2010-12- 01
2011-03-01 - 2011-05-01
' この問題を解決するにはどうすればよいですか? – Ariel

関連する問題