2012-09-20 120 views
4

我需要将{Name,DateTime,Open,High,Low,Close,Volume}股票市场“1min”数据分组到不同的时间范围内。 MYSQL上的“5分钟/ 15分钟/ 60分钟”。在sqlfiddle上构建的架构 - http://sqlfiddle.com/#!2/91433将OHLC-股票市场数据分为多个时间段 - Mysql

我发现一个链接 - Group OHLC-Stockmarket Data into multiple timeframes with T-SQL与MSSQL有类似的要求。

我试图按照链接 - http://briansteffens.com/2011/07/19/row_number-partition-and-over-in-mysql/,以获得row_number(),在MySQL分区解决问题。

我是sql的新手,任何人都可以请我指出正确的方向吗?

+0

你真的有问题就在这里,或者你只是说明你已经什么做到目前为止? – Bojangles

+0

@JamWaffles,谢谢你的关注。我没有解决问题的方法。我想要一个SQL查询将“1分钟”ohlc数据转换为“5分钟”间隔。 – Sri

回答

0

终于解决了这个问题有以下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)) 

最困难的部分是获得了“特定的时间间隔”打开和关闭。我正在做'高,低,开'的'内部连接'和'关闭'''日期'。我可以通过更改(Floor(unix_timestamp(mydate)/ 300))中的分母来切换时间间隔。目前只要它工作,不担心性能:)。

9

我知道这是一个老问题,但看看这个“更简单”的解决方案。开盘和收盘价格有一个窍门。你可能会喜欢它。

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 

周期以秒

+0

避免多重查询的好主意! '非常感谢 – iMacTia

+0

'period'包含什么?它只是字符串? – Sisir

+0

很久以前。但是现在我正在看它:它是从外部提供的整数/字符串。查询使用的字符串由“。Stackoverflow删除了这些引号。周期与查询字符串的其余部分...即从SQL的角度来看它是恒定的。你可以把300代替”+期+“,你将有5分钟硬编码。 – Andrej

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 
相关问题