我有一个这样定义的表变量
DECLARE @DatesTable TABLE
(
Id uniqueidentifier,
FooId uniqueidentifier,
Date date,
Value decimal (26, 10)
)
Id始终是唯一的,但是FooId在整个表中都是重复的。我想为每个具有max(date)的唯一FooId从此表中选择*。因此,如果有20行具有4个唯一的FooId,则我希望有4行,为日期最大的每个FooId选择一行。
我尝试使用group by,但是我不断收到关于各个字段不在select子句等中的错误。
答案 0 :(得分:3)
对row_number()
使用公用表表达式:
;WITH cte AS
(
SELECT Id, FooId, Date, Value,
ROW_NUMBER() OVER(PARTITION BY FooId ORDER BY Date DESC) As rn
FROM @DatesTable
)
SELECT Id, FooId, Date, Value
FROM cte
WHERE rn = 1
答案 1 :(得分:2)
最有效的方法通常是相关子查询:
select dt.*
from @DatesTable dt
where dt.date = (select max(dt2.date) from @DatesTable dt2 where dt2.fooid = dt.fooid);
但是,要使其高效,您需要在(fooid, date)
上建立索引。在SQL Server的最新版本中,可以在表变量上具有索引。在早期版本中,您可以使用主键来完成此操作。