我确信这是一个非常简单的SQL查询问题。这是一个表的模型,我试图使用timestamp列(As_Of)查询具有上次更新值的ID
ID Value As_of
1173 156 20090601
1173 173 20081201
1173 307 20080901
1173 305 20080601
127 209 20090301
127 103 20081201
127 113 20080901
127 113 20080601
1271 166 20090201
1271 172 20081201
1271 170 20080901
1271 180 20080601
...
我的结果应该是这样的
ID Value As_of
1173 156 20090601
127 209 20090301
1271 166 20090201
我应该用哪个选项来完成? SELF JOIN OR RANK()? 请向我推荐一些关于两种方法的表现的提示。哪个更快? 我听说SELF JOIN会降低查询的性能。
RANK():
SELECT ID, Value, As_Of, RANK() OVER(PARTITION BY ID ORDER BY As_of DESC) 'RNK'
FROM Table
and by filtering using the column having RANK value 1
自我加入:
SELECT ID, Value,As_of
from Table a inner join
(SELECT ID, MAX(As_of) as As_of
from Table group by ID) b
on a.ID=b.ID and a.As_of = b.As_of
答案 0 :(得分:1)
您应该尝试在数据上使用这两种方法来查看哪种方法更快。我可能怀疑rank()
方法会更快,因为它消除了明确的join
,但没有像真正的测试那样可以肯定地说。
顺便说一下,你应该尝试第三种方法:
select id, value, as_of
from table t
where not exists (select 1 from table t2 where t2.id = t.id and t2.as_of > t.as_of);
有时,这种方法也可以有很好的表现。
答案 1 :(得分:0)
当您拥有大量数据时,交叉应用或加入效果会更好
Select t1.id, t1.value, t1.as_of
from table t
cross apply(Select top 1 * from table t1 where t.id = t1.id order by as_of desc)t1
where t.as_of = t1.as_of
答案 2 :(得分:0)
SELECT ID,VALUE,AS_OF
FROM Table T1
WHERE 1=(
SELECT COUNT(*)
FROM Table T2
WHERE T1.ID=T2.ID AND T2.AS_OF>=T1.AS_OF
)
这也可能有用..