将OHLC-Stockmarket数据分组到多个时间范围内 - Mysql

Sri*_*Sri 6 mysql sql group-by stockquotes

我需要将股票市场"1min"数据与{Name,DateTime,Open,High,Low,Close,Volume}分组到不同的时间范围内,即.MYSQL上的"5分钟/ 15分钟/ 60分钟".Schema建立在sqlfiddle上 - http://sqlfiddle.com/#!2/91433.

我找到了一个链接 - 将OHLC-Stockmarket数据分组到多个时间帧中,使用T-SQL,对MSSQL有类似要求.

我尝试按照链接 - http://briansteffens.com/2011/07/19/row_number-partition-and-over-in-mysql/,获取row_number(),over,mysql中的分区来解决问题.

我是sql的新手,有谁能请我指出正确的方向?

And*_*lik 13

我知道这是一个老问题,但请看这个"更简单"的解决方案.开盘价和收盘价都有一招.你可能会喜欢它.

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  
Run Code Online (Sandbox Code Playgroud)

时间以秒为单位


Sri*_*Sri 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 ))
Run Code Online (Sandbox Code Playgroud)

最困难的部分是获得“特定时间间隔”的开盘和收盘。我正在对“日期”上的“最高、最低、开盘”和“收盘”进行内部连接。我可以通过更改 (Floor(unix_timestamp(mydate)/300 )) 中的分母来切换时间间隔。目前只要它能工作就不用担心性能:)。