2012-07-12 21 views
3

我有以下順序每天的股市數據的MySQL表:MySQL的 - 選中第一個和最後行(不是最小/最大)

_date, _opening_price, _high_price, _low_price, _close_price 

我想這個數據轉換成數據週報使用:

SELECT 
MAX(_date) AS _date, 
WEEK(_date) AS weeknum, 
_opening_price, 
MAX(_high_price) AS _high_price, 
MIN(_low_price) AS _low_price, 
_closing_price 
FROM myTable 
GROUP BY weeknum ORDER BY _date; 

如何選擇_opening_price所以它是第一_opening_price從本週的每日數據中?同樣,如何選擇_closing_price以便它是本週每日數據中的最後一個_closing_price價格?

下面是一個例子:

Google Stock Market Data - MSFT

截至2007-01-05本週opening_price應該從2007-01-03(紅色)採取和收盤價應該從2007-採取01-05(綠色)。同樣,對於2007-01-12結束的一週,開盤價格應該從2007-01-08開始,收盤價格從2007-01-12開始。

+0

您是否知道'WEEK'可能不會如你希望,如果你越過邊界一年的工作? – 2012-07-12 22:32:53

+0

是的 - 爲了簡單起見,我只是在這裏發佈了WEEK。完整的查詢實際上是CONCAT(WEEK(_date),' - ',YEAR(_date))AS weeknum。 – Zishan 2012-07-12 22:37:20

+0

我不認爲這也可以。 :-(雖然當然這取決於你想要發生什麼 - 如果你*想*你的星期分成兩年,當年改變時,我想它的工作... – 2012-07-12 22:38:35

回答

1

嘗試這種解決方案:

SELECT 
    MAX(a._date) weekending, 
    MAX(CASE WHEN a._date = b.mindate THEN a._opening_price END) openingprice, 
    MAX(CASE WHEN a._date = b.maxdate THEN a._closing_price END) closingprice 
FROM myTable a 
INNER JOIN 
(
    SELECT 
     CONCAT(YEAR(_date), '-', WEEK(_date)) weeknum, 
     MIN(_date) mindate, 
     MAX(_date) maxdate 
    FROM myTable 
    GROUP BY weeknum 
) b ON a._date IN (b.mindate, b.maxdate) 
GROUP BY b.weeknum 
+0

謝謝,贊恩。 – Zishan 2012-07-12 23:41:04

相關問題