如何高效地从 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)
上的索引。
我有一个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)
上的索引。