Agrupe los datos de OHLC-Stockmarket en múltiples frameworks temporales – Mysql

Necesito agrupar los datos de "1min" de stockmarket con {Name, DateTime, Open, High, Low, Close, Volume} en diferentes frameworks de time, es decir. "5mins / 15mins / 60mins" en MYSQL. Esquema construido en sqlfiddle – http://sqlfiddle.com/#!2/91433 .

Encontré un enlace – Agrupe OHLC-Stockmarket Data en múltiples frameworks de time con T-SQL con requisitos similares para MSSQL.

Traté de seguir el enlace – http://briansteffens.com/2011/07/19/row_number-partition-and-over-in-mysql/ , para get row_number (), over, partition en mysql para resolver el problema.

Soy un novato en sql, ¿alguien puede señalarme en la dirección correcta?

Sé que esta es una vieja pregunta, pero mira esta solución mucho más "simple". Hay un truco para precio abierto y cerrado. Quizás te guste.

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 

el período está en segundos

Finalmente resolvió el problema con la siguiente consulta de 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 )) 

La parte más difícil fue get el Abrir y Cerrar para los "Intervalos de Tiempo Específicos". Estoy haciendo una combinación interna de 'alto, bajo, abierto' con 'cercano' en 'date'. Puedo cambiar los intervalos de time cambiando el denominador en (Piso (unix_timestamp (mydate) / 300)). Actualmente no está preocupado por el performance, siempre y cuando funcione :).

La consulta tiene error, cambie MIN a MAX por precio de cierre:

 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