2017-10-23 8 views
0

私は燭台のチャートデータを作成しています。私は特定の期間、燭台のデータを選択する(最大、最小、開いた、閉じる)

created     value 
2017-09-25 17:55:04 3322.09 
2017-09-25 18:00:03 3317.49 
2017-09-25 18:05:02 3316.12 
2017-09-25 18:10:03 3325.16 
2017-09-25 18:15:04 3326.01 
2017-09-25 18:20:03 3330.49 
2017-09-25 18:25:04 3331.49 
2017-09-25 18:30:04 3335.24 
2017-09-25 18:35:03 3347.13 
2017-09-25 18:40:03 3343.21 
2017-09-25 18:45:05 3341.78 
2017-09-25 18:50:03 3339.64 
2017-09-25 18:55:04 3336.12 
2017-09-25 19:00:04 3327.73 
2017-09-25 19:05:03 3327.96 
2017-09-25 19:10:04 3325.93 

でデータベーステーブル(MySQLの)持っていると私は(例えば、15分または4時間ごと、6日ごとに任意の期間のための最大値、最小値、始値、近い値を選択しようとしていますなど)

は、これまでのところ私は非常に複雑

SELECT p.created, HOUR(`DATE`), MAX(p.value), MIN(p.value) 
FROM price 
GROUP BY DATE(`DATE`),HOUR(`DATE`) 

していません。それは私に毎時最大値と最小値を与えます。したがって、分、そして日、週、月などの "完全な"期間には、MONTH、DAYなどの関数を使用できます。

どのようにしてどのようにクエリを作成すればよいか考えてみましょう。たとえば、28分または31時間などですか?また、これは最大値と最小値の両方で機能しますが、期間の開始値(最初)と終了値(最後)も必要です。

+0

時間の開始値と終了値を取得する方法については、https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column?rq=1を参照してください。期間。 – Barmar

+0

特定の期間を取得するには、 'WHERE created BETWEEN start_time AND end_time'を使用してください。 – Barmar

+0

@Barmar - no、' BETWEEN'を使用しないでください。特に秒未満の精度のタイムスタンプがあるので、意図しない何かが起こる前に排他的な上限( '<')を使う方が良いでしょう。 –

答えて

0

任意の期間にグループ化するには、created列のUNIX時間値(つまり、UNIXエポックからの秒数)を使用し、目的の期間のサイズで除算します。結果の商(および残りを破棄する)。だから、すべての28分のグループに:

SELECT FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id 
     MIN(value) min_value, 
     MAX(value) max_value, 
     MIN(created) min_created, 
     MAX(created) max_created 
FROM  price 
GROUP BY grp_id 

あなたは、私はまた、各グループの最初と最後の値の倍を得min_createdmax_createdを、選択したことに気づくでしょう。あなたは、関連する記録(これは基本的に「groupwise maximum/minimum」問題のインスタンスである)のvalue Sを得るために、再びpriceテーブルに結果を結合することができます。

SELECT t.grp_id, 
     t.min_value, 
     t.max_value, 
     price_min.value first_value, 
     price_max.value last_value 
FROM (
    SELECT FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id 
      MIN(value) min_value, 
      MAX(value) max_value, 
      MIN(created) min_created, 
      MAX(created) max_created 
    FROM  price 
    GROUP BY grp_id 
) t JOIN price price_min ON price_min.created = t.min_created 
    JOIN price price_max ON price_max.created = t.max_created 

sqlfiddleでそれを参照してください。

+0

:winces:ouch。あなたのためのインデックスは、戻って、1年来る。 –

+0

@ Clockwork-Muse:データセットのサイズによって異なります。必要に応じて、索引付きの列に 'grp_id'をキャッシュしてください。 – eggyal

+0

?いいえ。それはグループが安定していると思われますが、私はそう考えない傾向があります(少なくとも2つは既に言及されています)。私はむしろ、結合可能で索引付け可能な基準を取得するという一般的な問題を解決したいと思う。 –

関連する問題