Вы можете использовать следующий подход:
- Используйте
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;