如何高效地从 SQL 服务器上批量获取最后一行的值

How to efficiently get a value from the last row in bulk on SQL Server

我有一个table像这样

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

我想要一个这样的table

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

我该怎么做。我知道有一个 SQL 服务器方法叫做 LAST_VALUE(...) OVER .(..) 但我不能让它与 GROUP BY.

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

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

你可以使用 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 似乎不起作用,但希望没关系。

我真的很想知道是否有更有效的解决方案,但是,我使用以下查询来满足此类需求;

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

最有效的方法可能是 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) 上的索引。