我有一张像这样的桌子
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
?
答案 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