Sat*_*ish 0 sql sql-server sql-server-2012
在我的项目中,我需要在同一个表中找到基于旧版和新版的差异任务.
id | task | latest_Rev
1 A N
1 B N
2 C Y
2 A Y
2 B Y
Run Code Online (Sandbox Code Playgroud)
预期结果:
id | task | latest_Rev
2 C Y
Run Code Online (Sandbox Code Playgroud)
所以我尝试了以下查询
Select new.*
from Rev_tmp nw with (nolock)
left outer
join rev_tmp old with (nolock)
on nw.id -1 = old.id
and nw.task = old.task
and nw.latest_rev = 'y'
where old.task is null
Run Code Online (Sandbox Code Playgroud)
当我的表有超过20k的记录时,这个查询会花费更多的时间吗?如何减少时间?
在我的公司不允许使用子查询
使用LAG函数删除自联接
SELECT *
FROM (SELECT *,
CASE WHEN latest_Rev = 'y' THEN Lag(latest_Rev) OVER(partition BY task ORDER BY id) ELSE NULL END AS prev_rev
FROM Rev_tmp) a
WHERE prev_rev IS NULL
Run Code Online (Sandbox Code Playgroud)