2013-02-05 60 views
0

假设我有一个表,TeamRatings,看起来像这样SQL查询的GroupBy与日期参数

|---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-| 

而且,假设一个团队的评级保持不变,直到他们玩一个新游戏,(代表新纪录)。例如。野马队对于日期为10/21/2012的评级假设为102.8

我想要一个带有日期参数的查询,该队列将返回一个记录,每个团队在指定日期之前阻止该团队最近的游戏。例如,

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

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

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

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

+0

是否使用的是RDBMS? –

回答

0

在MS SQL Server 2005或更高,您可以使用一个CTE与ROW_NUMBER功能:

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 
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