2014-01-08 71 views
1

我的股票數據存儲@幀1分鐘,所以1行= 1分鐘,我用這個查詢來獲取每天的最小,最大,總和,第一個和最後一個記錄。日內彙總數據

我每天有511分鐘的行(從0900到1730)。

SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131202; 
SELECT open FROM a2a ORDER BY time LIMIT 1; 
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1; 

SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131203; 
SELECT open FROM a2a ORDER BY time LIMIT 1; 
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1; 

SELECT MAX(high), MIN(low), SUM(volume) from a2a where date = 20131204; 
SELECT open FROM a2a ORDER BY time LIMIT 1; 
SELECT close FROM a2a WHERE time = 1730 ORDER BY time DESC LIMIT 1; 

在NetBeans中,這將返回9個標籤:

我的問題是:

1)是否有辦法讓這些結果在一個單一的標籤?

2)我是否需要每天執行3個不同的選擇,還是有一種方法可以在單個查詢中完成該選擇?

3)有沒有比這更快的方法來計算這些聚合?所發佈的內容就是一個例子,我需要獲得數百條每日數據。

編輯:表a2a圖像。日期和時間類型是CHAR,打開關閉的是DOUBLE,音量是INTEGER。

enter image description here

+0

請給我們描述你的a2a表,包括'date'和'time'列的數據類型。 –

回答

1

你可以打開和關閉使用相關子查詢:

SELECT symbol, date, MAX(high) AS high, MIN(low) as low, SUM(volume) as volume, 
     (select open from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time limit 1) as open, 
     (select close from a2a a2 where a1.symbol = a2.symbol and a1.date = a2.date order by time desc limit 1) as close 
    FROM a2a a1 
    GROUP BY symbol, date 
    ORDER BY symbol, date; 

a2a(symbol, date, time)的索引將加快此查詢。

+0

謝謝,使用你的索引查詢真的超級快! –

+0

1)如果我需要彙總數據才能獲得最後100個日常條形圖,那麼如何修改此查詢?現在它可以很好地工作,但它彙總了數據庫中的所有可用數據。 而且,2)如何獲得每週彙總的數據,或彙總5分鐘的數據? –

+0

@Albertoacepsut。 。 。您應該提出另一個問題,以此答案爲出發點。 –

2

嘗試此高/低/體積

SELECT symbol, 
     date, 
     MAX(high) AS dailyhigh, 
     MIN(low)  AS dailylow, 
     SUM(volume) AS dailyvolume 
    GROUP BY symbol, date 

你會每個符號得到每天一行。

很難說出你如何處理開盤價格。當然,整張桌子上的第一個時間戳,即使沒有日期,也不是正確的方法。所以,讓我們找出每個日期的最早時間戳。

SELECT symbol, 
     date, 
     MIN(time) AS opentime 
    FROM a2a 
    GROUP BY symbol, date 

現在,我們需要查找該時間戳的開盤價格。怎麼做?這會變得更復雜一些,因爲您可能在該問題的特定時間和日期有多行記錄。

SELECT a.symbol, 
     a.date, 
     AVG (a.open) AS dailyopen 
    FROM a2a a 
     JOIN (
     SELECT symbol, 
       date, 
       MIN(time) AS opentime 
      FROM a2a 
      GROUP BY symbol, date 
     ) AS b ON a.symbol = b.symbol 
       AND a.date = b.date 
       AND a.time = b.opentime 
    GROUP BY a.symbol, a.date 

這會爲每個符號和日期提取開始記錄(最低時間記錄)。

現在,在我看來,您的關閉記錄是具有時間戳1730的記錄或具有小於1730的時間戳的最新記錄。這是從快速的SQL轉變爲真正的工作,但這些是財務記錄和麥道夫在監獄裏,所以我們就這樣做吧。以下是每個日期的每個符號的結束時間。

SELECT symbol, 
     date, 
     MAX(time) AS closetime 
    FROM a2a 
    WHERE time <= 1730 
    GROUP BY symbol, date 

現在我們需要每個日期的每個符號的收盤價。我們將以與檢索開盤價格相同的方式來檢索。

SELECT a.symbol, 
     a.date, 
     AVG (a.close) AS dailyclose 
    FROM a2a a 
     JOIN (
     SELECT symbol, 
       date, 
       MAX(time) AS closetime 
      FROM a2a 
      WHERE time <= 1730 
      GROUP BY symbol, date 
     ) AS b ON a.symbol = b.symbol 
       AND a.date = b.date 
       AND a.time = b.closetime 
    GROUP BY a.symbol, a.date 

下一步是將這三個彙總查詢連接在一起,並限制您處理的日期範圍。

SELECT d.symbol, d.date, d.dailyhigh, d.dailylow, d.dailyvolume, 
     o.dailyopen, 
     c.dailyclose 
    FROM (
     /* the first summary query, daily high low volume */ 
     ) AS d 
    JOIN (
     /* the second summary query, daily open */ 
     ) AS o ON d.symbol = o.symbol AND d.date = o.date 
    JOIN (
     /* the third summary query, daily close */ 
     ) AS c ON d.symbol = c.symbol AND d.date = c.date 
WHERE d.date >= DATE_FORMAT(NOW() - INTERVAL 3 DAY, '%Y%m%d') 
    AND d.date < DATE_FORMAT(NOW(), '%Y%m%d') 
ORDER BY d.symbol, d.date 

這會給你三天的價值數據,以昨天結束。你必須剪切和粘貼你的三個摘要查詢到這個大胖連接。我很希望你會這樣做,因爲格式化深度嵌套的查詢並不是很有趣。

這並不簡單,但它對您的業務規則來說非常穩健和明確。

+0

但是你需要稍微擴展才能得到第一個和最後一個 – Strawberry

+0

@Strawberry,稍微有點兒? :-)這東西是真正的工作。 –

+0

@Ollie,非常感謝你,對我來說有點棘手,但我會仔細研究它。 –