Я использовал ROW_NUMBER () для достижения этой цели:
DECLARE @temp TABLE (
[Id] [bigint] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Extension] [varchar](30) NULL DEFAULT (''),
[StartTimestamp] [datetime] NULL,
[UserId] [varchar](30) NULL DEFAULT ('')
)
INSERT INTO @temp (Extension, StartTimestamp, UserId)
SELECT 100, {ts'2018-09-24 16:00:00.000'}, 'A' UNION ALL
SELECT 101, {ts'2018-09-24 16:01:15.000'}, 'B' UNION ALL
SELECT 100, {ts'2018-09-24 16:01:14.000'}, '' UNION ALL
SELECT 102, {ts'2018-09-24 16:02:24.000'}, 'C' UNION ALL
SELECT 100, {ts'2018-09-24 16:05:00.000'}, 'A' UNION ALL
SELECT 101, {ts'2018-09-24 16:07:00.000'}, 'B' UNION ALL
SELECT 101, {ts'2018-09-24 16:30:00.000'}, ''
SELECT
a.Id, a.Extension, a.StartTimestamp, a.UserId, b.StartTimestamp, b.UserId
FROM @temp a
JOIN (
SELECT
ROW_NUMBER() OVER(PARTITION BY a.Extension ORDER BY b.StartTimestamp) RowNo,
a.Id, a.Extension, b.StartTimestamp, b.UserId
FROM @temp a
JOIN @temp b ON b.Extension = a.Extension -- edited to add this
AND LEN(b.UserId) > 0
AND b.StartTimestamp >= DATEADD(mi, -10, a.StartTimestamp)
AND b.StartTimestamp < DATEADD(mi, 10, a.StartTimestamp)
WHERE a.UserId = ''
) b ON b.Id = a.Id AND b.RowNo = 1