2012-09-07 32 views
2

我需要通過最近的日期從一個日期減去在MySQL兩行:SQL減兩行

開始表:

Stock  Date   Price 
GOOG  2012-05-20 402 
GOOG  2012-05-21 432 
APPL  2012-05-20 553 
APPL  2012-05-21 590 
FB   2012-05-20  40 
FB   2012-05-21  34 

這是結果表:

Stock  Date   Price Change 
GOOG  2012-05-21 30 
APPL  2012-05-21 37 
FB   2012-05-21 -6 

現在我只是每家公司設立兩個日期,但獎金upvotes如果您的查詢可以處理任意數量的日期。

+0

有沒有超過兩個? –

+0

你正在使用什麼特定的rdms?我認爲它是SQLServer。 –

+0

@JohnWoo爲什麼假設SQL Server? yyyy-mm-dd看起來像MySQL。 –

回答

3

我所做的是我得到兩個單獨的查詢來獲得每個股票的最大日期和最小日期。試試這個,

SELECT maxList.stock, 
     maxList.Date, 
     (maxlist.Price - minlist.Price) totalPrice 
FROM 
    (
     SELECT a.* 
     FROM tableName a INNER JOIN 
     (
      SELECT  Stock, MAX(date) maxDate 
      FROM  tableName 
      GROUP BY Stock 
     ) b ON a.stock = b.stock AND 
       a.date = b.maxDate 
    ) maxList INNER JOIN 
    (
     SELECT a.* 
     FROM tableName a INNER JOIN 
     (
      SELECT  Stock, MIN(date) minDate 
      FROM  tableName 
      GROUP BY Stock 
     ) b ON a.stock = b.stock AND 
       a.date = b.minDate 
    ) minList ON maxList.stock = minList.stock 

SQLFiddle Demo

更新1

看到你的最後一句話:Right now I just have two dates per company, but bonus upvotes if your query can handle any number of dates.如果你有這樣的記錄呢?

FB   2012-05-20  40 
FB   2012-05-21  34 
FB   2012-05-22  42 

它的結果是什麼?

enter image description here

1

我知道這已經回答了,但問題引起了我的興趣,所以我想我會試試看。

我認爲你可能想看到任何兩個連續日期之間的差異。

所以以下數據:

GOOG  2012-09-07 42.34 
GOOG  2012-09-06 44.56 
GOOG  2012-09-01 44.32 
FB   2012-09-07 17.82 
FB   2012-08-05 12.98 

你會得到:

GOOG  2012-09-07 2012-09-06 -2.22 
GOOG  2012-09-06 2012-09-01 0.24 
FB   2012-09-07 2012-08-05 4.84 

我寫了這個查詢是:

SELECT t1.Stock, t1.Date AS CurrentDate, oldDate.Date AS OldDate, (t1.Price - oldDate.Price) AS PriceChange 
FROM MP_StockTable t1 
JOIN (SELECT t2.Stock, t2.Date AS date1, (SELECT MAX(t3.Date) FROM MP_StockTable t3 WHERE t3.Date < t2.Date AND t3.Stock = t2.Stock GROUP BY t3.Stock) AS date2 
     FROM MP_StockTable t2) AS StockDates ON StockDates.Stock = t1.Stock AND StockDates.date1 = t1.Date 
JOIN MP_StockTable oldDate ON oldDate.Stock = t1.Stock AND oldDate.Date = StockDates.date2 

內聯表基本計算最接近每行的前一日期。因此,對於上述數據,生成的表將是這樣的:

GOOG  2012-09-07 2012-09-06 
GOOG  2012-09-06 2012-09-01 
GOOG  2012-09-01 NULL 
FB   2012-09-07 2012-08-05 
FB   2012-08-05 NULL 

然後,使用這兩個日期從該表中獲得我們兩家的價格點。

注意:我在SQLServer中測試,所以如果這需要對mySql進行一些調整(這是多年以來使用mySql,所以我已經忘記了差異)。