7

株式市場の "1min" データを {Name, DateTime, Open, High, Low, Close, Volume} で異なる時間枠にグループ化する必要があります。MYSQL の「5 分/15 分/60 分」。sqlfiddle に基づいて構築されたスキーマ - http://sqlfiddle.com/#!2/91433

リンクを見つけました-MSSQLの同様の要件を持つT-SQLを使用して、OHLC-Stockmarket Dataを複数の時間枠にグループ化します。

リンクをたどろうとしました - http://briansteffens.com/2011/07/19/row_number-partition-and-over-in-mysql/ 、mysqlでrow_number()、over、partitionを取得して問題を解決しました。

私はSQLの初心者です。誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

1

最後に、次のmysqlクエリで問題を解決しました。

select min(a.mydate),max(a.myhigh) as high,min(a.mylow) as low, 
min(case when rn_asc = 1 then a.myopen end) as open,
min(case when rn_desc = 1 then b.myclose end) as close

from( 

select 
@i := if((@lastdate) != (Floor(unix_timestamp(mydate)/300 )), 1, @i + 1) as rn_asc,
          mydate, myhigh, mylow, myopen, myclose,
          @lastdate := (Floor(unix_timestamp(mydate)/300 ))

from
  onemindata_1,
  (select @i := 0) vt1,
  (select @lastdate := null) vt2 order by mydate

) a

inner join(

select 
@j := if((@lastdate1) != (Floor(unix_timestamp(mydate)/300 )), 1, @j + 1) as rn_desc,
          mydate,myclose,
          @lastdate1 := (Floor(unix_timestamp(mydate)/300 ))

from
  onemindata_1,
  (select @j := 0) vt1,
  (select @lastdate1 := null) vt2 order by mydate desc

)b
on a.mydate=b.mydate
group by (Floor(unix_timestamp(a.mydate)/300 ))

最も困難な部分は、「特定の時間間隔」のオープンとクローズを取得することでした。「date」に「close」を使用して「high、low、open」の内部結合を実行しています。(Floor(unix_timestamp(mydate)/ 300))の分母を変更することで、時間間隔を切り替えることができます。現在、動作している限り、パフォーマンスについては心配していません:)。

于 2012-09-21T18:28:07.180 に答える
0

クエリにエラーがあります。終値の MIN を MAX に変更してください:

SELECT
  FLOOR(MIN(`timestamp`)/"+period+")*"+period+" AS timestamp,
  SUM(amount) AS volume,
  SUM(price*amount)/sum(amount) AS wavg_price,
  SUBSTRING_INDEX(MIN(CONCAT(`timestamp`, '_', price)), '_', -1) AS `open`,
  MAX(price) AS high,
  MIN(price) AS low,
  SUBSTRING_INDEX(MAX(CONCAT(`timestamp`, '_', price)), '_', -1) AS `close`
FROM transactions_history -- this table has 3 columns (timestamp, amount, price)
GROUP BY FLOOR(`timestamp`/"+period+")
ORDER BY timestamp  
于 2015-08-12T09:10:53.263 に答える