2014-01-10 115 views
0

我有這個查詢來執行日內數據彙總到日常數據(感謝Gordon Linoff)。每週和日內數據彙總

我存儲股票市場數據每行1分鐘,我有511 1分鐘的行每天(從0900到1730)。我使用MySQL 5.6.11 VERS

數據是如下

enter image description here

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; 

我的問題圖片:

1)如何修改這個查詢,如果我需要彙總數據只獲得最後100個每日酒吧?

2)如何將數據彙總到每週或彙總成5分鐘的數據?

編輯:每週彙總此版本的作品(和每月聚集過多使用一個月,而不是周)

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

我還有東西要進行修改:

1)關於日常聚集第一查詢會返回100個日曆日,而不是100個每日聚合行。我需要從最近的後退開始對100條記錄進行排序。我每週需要100條記錄才能進行每週聚合。

2)5分鐘或n分鐘聚合?例如,聚合從0900到0904,然後從0905到0909等5分鐘聚合

回答

1

你是什麼意思的最後100個每日酒吧?如果你指的是過去100天內:

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 
WHERE date >= date_sub(CURDATE(), interval 100 day) 
GROUP BY symbol, date 
ORDER BY symbol, date; 

如果想要另一個分組,那麼你需要改變group by和相關子具有相同的表達。例如:

SELECT symbol, week(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.week(date) = a2.week(date) order by time limit 1) as open, 
    (select close from a2a a2 where a1.symbol = a2.symbol and a1.week(date) = a2.week(date) order by time desc limit 1) as close 
FROM a2a a1 
WHERE date >= date_sub(CURDATE(), interval 100 day) 
GROUP BY symbol, week(date) 
ORDER BY symbol, week(date); 
+0

是的我的意思是最後100天;執行你的查詢我得到這個錯誤 錯誤代碼1064,SQL狀態42000:你的SQL語法有錯誤;檢查對應於您的MySQL服務器版本的手冊,以便在'' GROUP BY符號,日期 ORDER BY符號,日期'在第5行 行1列1 –

+0

@Albertoacepsut附近使用正確的語法。 。 。正確的函數是'date_sub()',而不是'datesub()'。 –

+0

@Gordon ...那麼第一個查詢現在完美運行,我只在限制100中更改;而不是WHERE date> = date_sub(CURDATE(),間隔100天),以獲得每日100個聚合行。我在第二個查詢時收到錯誤錯誤代碼1630,SQL狀態42000:FUNCTION a1.week不存在。檢查參考手冊 第1行第1列 –