带日期参数的SQL查询GroupBy

带日期参数的SQL查询GroupBy,sql,group-by,Sql,Group By,假设我有一张桌子,TeamRatings,看起来像这样 |--团队-|-评估日期-|-评级-| |-圣徒--2012年10月15日--81.1-| |-野马队--2012年10月15日--91.1-- |-乌鸦--10/16/2012--101.1-| |-野马队-2012年10月22日-82.1 |-乌鸦--2012年10月22日--83.1-| |-圣徒--2012年10月29日--84.1-| |-野马队-2012年10月28日-85.1-| |-乌鸦--2012年10月29日--86.1

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

|--团队-|-评估日期-|-评级-| |-圣徒--2012年10月15日--81.1-| |-野马队--2012年10月15日--91.1-- |-乌鸦--10/16/2012--101.1-| |-野马队-2012年10月22日-82.1 |-乌鸦--2012年10月22日--83.1-| |-圣徒--2012年10月29日--84.1-| |-野马队-2012年10月28日-85.1-| |-乌鸦--2012年10月29日--86.1-| 此外,假设一支球队的得分保持不变,直到他们打了一场新的比赛,代表了一项新的记录。例如,假设2012年10月21日野马队的评级为102.8

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

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

|--团队--|-评估日期--|-评级-| |-圣徒-2012年10月15日-81.1-| |-野马队-2012年10月22日-82.1 |-乌鸦--2012年10月22日--83.1-|
非常感谢您的帮助。谢谢

在MS SQL Server 2005或更高版本上,您可以使用带有行号功能的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 

您可以使用以下更一般的查询:

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

您正在使用哪些rdbms?