2015-04-01 48 views
2

嗨給出了下面的原始表格,你如何編寫一個查詢來獲得最大價格和它的日期就像下面的結果。這是在sql服務器。爲所有記錄選擇一個最大值

原始表:tblstock

symbol, date, price 
aapl, 2/2/2015, 115 
aapl, 2/3/2015, 119.56 
aapl, 2/4/2015, 116 
aapl, 2/5/2015, 109 
aapl, 2/6/2015, 107.56 

想要的結果:

symbol, date, price, highpricedate, highprice 
aapl, 2/2/2015, 115, 2/3/2015, 119.56 
aapl, 2/3/2015, 119.56, 2/3/2015, 119.56 
aapl, 2/4/2015, 116, 2/3/2015, 119.56 
aapl, 2/5/2015, 109, 2/3/2015, 119.56 
aapl, 2/6/2015, 107.56, 2/3/2015, 119.56  
+0

複製數據有什麼意義?爲什麼不單獨選擇它作爲1行2列結果集? – zerkms 2015-04-01 19:37:40

+0

爲了報告目的,所以它會跑得更快 – user3690095 2015-04-01 19:38:26

+0

「它會跑得更快」---誰告訴你的? 「2個查詢比1快」---並非總是如此。我會說,如果有人問/說 - 這是相反的機會。當有人說「它會更快」,而他們甚至不知道查詢的樣子是什麼時,它總是讓我感到意外。 – zerkms 2015-04-01 19:38:43

回答

7

我會建議outer apply此:

select t.*, tmax.date as highpricedate, tmax.price as highprice 
from tblstock t outer apply 
    (select top 1 t2.* 
     from tblstock t2 
     where t2.symbol = t.symbol 
     order by t2.price desc 
    ) tmax; 

事實上,cross apply將工作一樣好。

+0

這裏的警告是,如果你有多個股票代碼,那麼'highpricedate'和'highprice'將用於表中的所有股票價格。 – JNevill 2015-04-01 19:43:38

+1

「where」子句中有一個小錯字。它需要與外部查詢相關聯。 – shawnt00 2015-04-01 20:02:24

+0

您在select子句中還有另一個小的拼寫錯誤。 t2不再存在。請參閱tmax。 – AXMIM 2015-04-02 12:33:24

2

您可以使用windows功能。 說明:
使用Windows功能(或者如果您願意,可以使用over子句),您可以輕鬆獲得HighPrice。

獲得HighPriceDate有點棘手,但仍然相當簡單。 通過使用Row_Number對分區的每行進行排名,我們可以使用Lag函數來獲取HighPriceDate。

SELECT symbol, 
     [date], 
     price, 
     highprice  = MAX(price) OVER(PARTITION BY symbol), 
     HighPriceDate = LAG([date], i - 1) OVER (PARTITION BY symbol ORDER BY i) 
FROM ( SELECT *, 
       i = ROW_NUMBER() OVER(PARTITION BY symbol ORDER BY PRICE DESC) 
     FROM @tblstock) AS Sub 
+0

缺少高價格的日期...,所以在我解決它之前,請忘記此答案。 – AXMIM 2015-04-01 19:53:14

+0

已修復,使用具有滯後功能的Row_Number來檢索高價日期。應該工作得很好。 – AXMIM 2015-04-01 20:07:29

+1

不錯的解決方案。我個人喜歡windows功能。大家知道,在SQL Server 2008中只引入了ROW_NUMBER().LAG(),LEAD()和其他版本直到2012年才推出。這樣當有人需要2008解決方案時,您就知道可以使用哪些功能! – Stephan 2015-04-02 05:39:49