-1

由于我对 Outer Apply 不太熟悉,因此我对重写上一个问题中的加入感到有点迷茫。它运行良好,但不适用于大量数据。对此的任何帮助表示赞赏。

上一个问题

4

1 回答 1

0

您可以使用以下方法:

  • 使用 aCTE创建一个集合并用于ROW_NUMBER为您的呼叫编号。
  • ROW_NUMBER允许用 a和一个部分指定OVER()子句PARTITION BYORDER 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 回答