2011-05-24 62 views
0

我有一張表,其中包含各種公司的單獨價格列表,例如。來自Tic查詢的MySQL OHLC

+ ------- + --------- + --------- + ------ +

|符號| TTime | TPrice |卷|

+ ------- + --------- + --------- + ------ +

| AAM | 101549 | 1303.15 | 100 |

| AAM | 120405 | 1308.23 | 2 |

| AAM | 132142 | 1302.16 | 11 |

| AAM | 145120 | 1307.75 | 1 |

+ ------- + --------- + --------- + ------ +

(有多個符號,但

我使用以下

SELECT tic.Symbol, 
     tic.TDate, 
     (Case when 
      tic.TTime = Min(tic.TTime) 
     then tic.TPrice end) as `Open`, 
     Max(tic.TPrice) AS High, 
     Min(tic.TPrice) AS Low, 
     (Case when 
      tic.TTime = Max(tic.TTime) 
     then tic.TPrice end) as `Close`, 
     Sum(Volume) AS Volume, 
     Max(tic.TTime) 
     FROM tblfinalasxtic AS tic GROUP BY Symbol LIMIT 10; 

我得到一個重大問題

時,有一次爲整個一天收盤價僅產生我可以讓那些沒有任何問題)或者如果只有多個條目在同一時間結束會產生即如果時間範圍是例如沒有收盤價。

開放的工作正常我的假設是,最大的工作,但沒有去。

回答

1

基本上我來到這就像一個解決這個

1:/創建抽動值的表**確保您所創建的ID列**

CREATE TABLE price_tic (
      `id` INT(10) NULL AUTO_INCREMENT, 
      `T` VARCHAR(3) NULL, 
      `SysDateTime` DATETIME NULL, 
      `TIC` FLOAT NULL, 
      `Volume` FLOAT NULL, 
      PRIMARY KEY (`id`) 
      ) 
      COLLATE='latin1_bin' 
      ENGINE=MEMORY 
      ROW_FORMAT=DEFAULT 

2:/下創建對於開盤價最高價最低價,成交量,OI等臨時表

CREATE TEMPORARY TABLE symbol_ohl 
      (ExchDate DATE, 
      ExchTime TIME) 
      ENGINE = MEMORY 
      AS(SELECT 
        DATE_FORMAT(`SysDateTime`,'%Y-%m-%d') AS ExchDate, 
        DATE_FORMAT(`SysDateTime`,'%H:%i:00') AS ExchTime, 
        DATE_FORMAT(`SysDateTime`,'%Y-%m-%d %H:%i:00') AS ExchDateTime, 
        `TIC` AS `OPEN`, 
        MAX(`TIC`) AS `HIGH`, 
        MIN(`TIC`) AS `LOW`, 
        SUM(Volume) AS `Volume`, 
        COUNT(`TIC`) AS `OpnInt` 
        FROM symbol_tic 
        GROUP BY ExchDateTime 
        ORDER BY ExchDateTime) 

3:/下創建一個使用的ID號加入到自身,這樣就可以正確地訂購它的收盤價臨時表。

CREATE TEMPORARY TABLE symbol_cls 
      (SysDate DATE, 
      SysTime TIME, 
      ExchTime TIME) 
      ENGINE = MEMORY 
      AS(SELECT 
        `TIC` AS `CLOSE`, 
        DATE_FORMAT(`SysDateTime`,'%Y-%m-%d') AS `SysDate`, 
        DATE_FORMAT(`SysDateTime`,'%H:%i:00') AS SysTime, 
        DATE_FORMAT(`SysDateTime`,'%H:%i:00') AS ExchTime, 
        DATE_FORMAT(`SysDateTime`,'%Y-%m-%d %H:%i:00') AS ExchDateTime 
        FROM symbol_tic 
        INNER JOIN 
        (SELECT MAX(id) AS id 
        FROM symbol_tic 
        GROUP BY DATE_FORMAT(`SysDateTime`,'%Y-%m-%d %H:%i:00')) 
        ids ON symbol_tic.id = ids.id) 

4:/最後合併產生的臨時表,我使用的是由於種種原因更換成,但你的想法

REPLACE INTO symbol_working 
     (`ExchDate`, `ExchTime`, `SysDate`, `SysTime`, `ExchDateTime`, 
     `SysDateTime`, `OPEN`, `HIGH`, `LOW`, `CLOSE`, `Volume`, `OpnInt`) 
     SELECT 
       symbol_ohl.`ExchDate` AS ExchDate, 
       symbol_ohl.`ExchTime` AS ExchTime, 
       symbol_cls.`SysDate` AS 'SysDate', 
       symbol_cls.`SysTime` AS 'SysTime', 
       symbol_ohl.`ExchDateTime` As ExchDateTime, 
       CONCAT(symbol_cls.`SysDate`, ' ',symbol_cls.`SysTime`) As SysDateTime, 
       symbol_ohl.`OPEN`, 
       symbol_ohl.`HIGH`, 
       symbol_ohl.`LOW`, 
       symbol_cls.`CLOSE`, 
       symbol_ohl.Volume AS `Volume`, 
       symbol_ohl.OpnInt AS `OpnInt` 
       FROM 
       (symbol_ohl JOIN symbol_cls 
       ON (symbol_ohl.ExchDateTime = symbol_cls.ExchDateTime)) 

希望這可以幫助別人。

這很快就可以運行,我在每日輸出的S & P emini上運行,運行需要幾秒鐘。