由于我对 Outer Apply 不太熟悉,因此我对重写上一个问题中的加入感到有点迷茫。它运行良好,但不适用于大量数据。对此的任何帮助表示赞赏。
问问题
135 次
1 回答
0
您可以使用以下方法:
- 使用 a
CTE
创建一个集合并用于ROW_NUMBER
为您的呼叫编号。 ROW_NUMBER
允许用 a和一个部分指定OVER()
子句PARTITION BY
ORDER BY
这将返回您的电话列表,其中每个电话号码按顺序作为连续索引EntryTime
。
然后,您可以使用自联接来查找相应的上一行。
declare @table table (
PhoneNumber nvarchar(20),
EntryTime datetime
)
insert into @table values ('(321) 546-7842', dateadd(hour,-30,getdate()));
insert into @table values ('(321) 546-7842', dateadd(hour,-3,getdate()));
insert into @table values ('(251) 546-9442', dateadd(hour,-2,getdate()));
WITH cte AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY PhoneNumber ORDER BY EntryTime) AS CallIndex
,t.*
FROM @table t
)
SELECT *
FROM cte t1
LEFT JOIN cte t2 ON t1.PhoneNumber=t2.PhoneNumber AND t1.CallIndex=t2.CallIndex-1
ORDER BY t1.PhoneNumber, t1.EntryTime;
于 2018-07-02T13:02:02.030 回答