没有必要让它运行得更快。您能详细介绍一下结果表和#tmp的结构吗?每个表的唯一键是什么?每个行中有多少行?lag()的作用是什么?您好,对不起,我使用的是SQL Server 2012。这仅适用于Azure,2014年和2016年。更新:索引并没有加快更新
没有必要让它运行得更快。您能详细介绍一下结果表和#tmp的结构吗?每个表的唯一键是什么?每个行中有多少行?lag()的作用是什么?您好,对不起,我使用的是SQL Server 2012。这仅适用于Azure,2014年和2016年。更新:索引并没有加快更新,sql,sql-server,tsql,stored-procedures,ssms,Sql,Sql Server,Tsql,Stored Procedures,Ssms,没有必要让它运行得更快。您能详细介绍一下结果表和#tmp的结构吗?每个表的唯一键是什么?每个行中有多少行?lag()的作用是什么?您好,对不起,我使用的是SQL Server 2012。这仅适用于Azure,2014年和2016年。更新:索引并没有加快更新语句的速度。什么意思是2012年不可用?我不能从结果表中获取所有信息,因为该表中有数百万行。如果我在这里添加一些约束,它会工作吗?lag()做什么?嗨,对不起,我在SQL Server 2012上。这仅适用于Azure,2014年和2016年。
没有必要让它运行得更快。您能详细介绍一下结果表和#tmp的结构吗?每个表的唯一键是什么?每个行中有多少行?lag()的作用是什么?您好,对不起,我使用的是SQL Server 2012。这仅适用于Azure,2014年和2016年。更新:索引并没有加快更新语句的速度。什么意思是2012年不可用?我不能从结果表中获取所有信息,因为该表中有数百万行。如果我在这里添加一些约束,它会工作吗?lag()做什么?嗨,对不起,我在SQL Server 2012上。这仅适用于Azure,2014年和2016年。更新:索引并没有加快更新语句的速度。什么意思是2012年不可用?我不能从结果表中获取所有信息,因为该表中有数百万行。如果我在这里添加一些约束条件,它会起作用吗?不确定这是否会更快,但确实值得一试。此解决方案与原始解决方案所需的处理时间相同。很抱歉D:好吧,我甚至没有想到会加速,它针对的是“由于查询的前1部分,我不能这样做”的问题——现在没有前1部分。在具有16M行和300k唯一“数字”的表上进行测试,此查询大约需要7秒。不确定这是否会更快,但确实值得一试。此解决方案需要与原始解决方案相同的处理时间。很抱歉D:好吧,我甚至没有想到会加速,它针对的是“由于查询的前1部分,我不能这样做”的问题——现在没有前1部分。在具有16M行和300k唯一“数字”的表上进行测试,此查询大约需要7秒。Msg 157,级别15,状态1,第53行聚合可能不会出现在UPDATE语句的集合列表中。@Paul是的,我忘记了这一点。需要有一个子查询。我将在明天修复或删除它WMSG 157,级别15,状态1,第53行UPDATE语句的集合列表中可能不会出现聚合。@Paul是的,我忘记了。需要有一个子查询。明天我将修复或删除它
UPDATE #tmp
SET prev_test_date = (
SELECT TOP 1 r.test_date
FROM [dbo].[results] r (NOLOCK)
WHERE r.number = #tmp.number
AND r.test_date < #tmp.test_date
ORDER BY r.test_date DESC
)
UPDATE #tmp
SET prev_test_date = (
SELECT TOP 1 r.test_date
FROM [dbo].[results] r
WHERE r.number = #tmp.number AND
r.test_date < #tmp.test_date
ORDER BY r.test_date DESC
)
with r as (
select r.*,
lag(r.test_date) over (partition by r.number order by r.test_date desc) as prev_test_date
from [dbo].[results] r
)
update t
set t.prev_test_date = r.prev_test_date
from #tmp t join
r
on t.number = r.number;
UPDATE #tmp
SET #tmp.prev_test_date = tt.maxdate
from #tmp
join
(
select #tmp.number, max(r.test_date) maxdate
from #tmp
join [dbo].[results] r (NOLOCK)
on r.number = #tmp.number
AND r.test_date < #tmp.test_date
group by #tmp.number
) tt
on tt.number = #tmp.number
UPDATE #tmp
SET prev_test_date = (
SELECT max(r.test_date)
FROM [dbo].[results] r (NOLOCK)
WHERE r.number = #tmp.number
AND r.test_date < #tmp.test_date
)
with cteOrderedResults as (
-- Ideally R will be clustered by number, test_date for this
select R.number
,R.test_date
,row_number() over ( partition by R.number
order by R.test_date desc
-- So the most recent R.test_date from
-- before T.test_date gets RowNo=1
) as RowNo
from dbo.results R
inner join #tmp T on R.number=T.number
and R.test_date<T.test_date
)
update T
set T.prev_test_date=R.test_date
from #tmp T
inner join cteOrderedResults R on T.number=R.number
and 1=R.RowNo