0

假设我有一张桌子,TeamRatings,看起来像这样

|---Team----|--ValuationDate--|-Rating-|

|--Saints---|---10/15/2012----|---81.1-|  
|--Broncos--|---10/15/2012----|---91.1-|  
|--Ravens---|---10/16/2012----|--101.1-|  
|--Broncos--|---10/22/2012----|---82.1-|  
|--Ravens---|---10/22/2012----|---83.1-|  
|--Saints---|---10/29/2012----|---84.1-|  
|--Broncos--|---10/28/2012----|---85.1-|
|--Ravens---|---10/29/2012----|---86.1-|

此外,假设球队的评分保持不变,直到他们玩新游戏(代表新记录)。例如,野马队在 2012 年 10 月 21 日的评分假定为 102.8

我想要一个带有日期参数的查询,它将为每支球队返回一条记录,代表该球队在指定日期之前的最新比赛。例如,

如果我输入 10/23/2012 作为我的日期参数,查询应该返回

|---Team---|-ValuationDate---|-Rating-|

|--Saints--|---10/15/2012----|---81.1-|  
|--Broncos-|---10/22/2012----|---82.1-|  
|--Ravens--|---10/22/2012----|---83.1-|

任何帮助是极大的赞赏。谢谢!

4

2 回答 2

0

在 MS SQL Server 2005 或更高版本上,您可以使用带有ROW_NUMBER函数的 cte:

WITH x 
     AS (SELECT team, 
                valuationdate, 
                rating, 
                rn = Row_number() 
                       OVER( 
                         partition BY team 
                         ORDER BY valuationdate DESC) 
         FROM   teamratings 
         WHERE  valuationdate < @DateParam) 
SELECT team, 
       valuationdate, 
       rating 
FROM   x 
WHERE  rn = 1 
于 2013-02-05T22:13:41.327 回答
0

您可以使用更通用的查询,如下所示:

select Team, x.ValuationDate, Rating
from TeamRatings inner join
(
 select Team, max(ValuationDate) as ValuationDate
 from TeamRatings 
 where ValuationDate < @dateParameter
 group by Team
) x on TeamRatings.Team = x.Team and TeamRatings.ValuationDate = x.ValuationDate
于 2013-02-05T22:43:45.173 回答