如何在SQL Server上有效地从批量的最后一行获取值

时间:2015-03-29 14:33:19

标签: sql sql-server aggregate-functions

我有一张像这样的桌子

Id | Type  | Value
--------------------
 0 | Big   | 2
 1 | Big   | 3
 2 | Small | 3
 3 | Small | 3

我想得到一张这样的表

Type  | Last Value
--------------------
Small | 3
Big   | 3

我该怎么做?我知道有一个名为 LAST_VALUE(...)OVER。(..)的SQL Server方法,但我无法将其与GROUP BY一起使用。

我也尝试过使用SELECT MAX(ID)& SELECT TOP 1..但这似乎有点低效,因为每个值都会有一个子查询。当表中有几百万行时,查询会花费太长时间。

有没有办法快速获取这些值的最后一个值,可能使用LAST_VALUE

3 个答案:

答案 0 :(得分:2)

你可以使用rownumber:

select
  type,
  value
from
(
  select 
    type,
    value,
    rownumber() over (partition by type order by id desc) as RN
) TMP
where RN = 1

现在无法测试,因为SQL Fiddle似乎不起作用,但希望没问题。

答案 1 :(得分:1)

最有效的方法可能是not exists,它为底层运算符使用反连接:

select type, value
from likeso l
where not exists (select 1 from likeso l2 where l2.type = l.type and l2.id > l.id)

为了提高性能,您需要likeso(type, id)上的索引。

答案 2 :(得分:0)

我真的很想知道是否有更有效的解决方案,但我会根据这些需求使用以下查询;

Select  Id, Type, Value
From    (   Select *, Max (Id) Over (Partition By Type) As LastId
            From #Table) T
Where   Id = LastId