Переписывание Внешнего применяется, чтобы присоединиться к производительности - PullRequest
0 голосов
/ 02 июля 2018

Так как я не очень хорошо знаком с Outer Apply, я немного растерялся, переписывая один из моих предыдущих вопросов для присоединения. Это работало хорошо, но не для больших кусков данных. Любая помощь с этим приветствуется.

Предыдущий вопрос

1 Ответ

0 голосов
/ 02 июля 2018

Вы можете использовать следующий подход:

  • Используйте CTE для создания набора и используйте ROW_NUMBER для нумерации ваших вызовов.
  • ROW_NUMBER позволяет указать предложение OVER() с PARTITION BY и ORDER BY part

Это вернет список ваших телефонных звонков, где каждый телефонный номер в виде последовательного индекса в порядке 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;
...