重写外部申请加入演出

时间:2018-07-02 09:26:12

标签: sql-server-2008 tsql outer-apply

由于我对外部申请并不那么熟悉,因此我不得不重写先前提出的问题以加入。它运作良好,但不适用于大数据量。对此有任何帮助。

Previous question

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法:

  • 使用CTE创建一组并使用ROW_NUMBER为您的呼叫编号。
  • ROW_NUMBER允许指定OVER()PARTITION BY部分的ORDER BY子句

这将返回您的电话列表,其中每个电话号码以EntryTime的顺序作为连续索引。

然后可以使用 self-join 查找对应的上一个行。

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;