2015-04-01 41 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