选择所有记录的最大值

时间:2015-04-01 19:36:28

标签: sql sql-server tsql sql-server-2012

您好了下面的原始表格,您如何编写查询以获得最高价格及其日期,就像下面的结果一样。这是在sql server中。

原始表: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    

2 个答案:

答案 0 :(得分: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也可以正常工作。

答案 1 :(得分: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