Вы должны иметь возможность использовать два бинарных поиска в AuditRowId.
Чтобы найти идентификатор, связанный со временем начала, а другой, чтобы найти идентификатор, связанный с временем окончания, а затем выполнить поиск диапазона между этими двумя идентификаторами.
Пример основной идеи ниже: SQL Fiddle (хотя я не гарантирую, что это ошибка бесплатно)
DECLARE @AuditDTimStart DATETIME = '2000-01-15',
@AuditDTimEnd DATETIME = '2000-01-20'
IF @AuditDTimEnd < @AuditDTimStart
RAISERROR('Start date after end date',16,1)
DECLARE @AuditRowIdStart INT,
@AuditRowIdEnd INT,
@AuditRowIdMin1 INT,
@AuditRowIdMax1 INT,
@AuditRowIdMin2 INT,
@AuditRowIdMax2 INT
SELECT TOP 1 @AuditRowIdMin1 = AuditRowId,
@AuditRowIdMin2 = AuditRowId,
@AuditRowIdStart = -1 + CASE
WHEN @AuditDTimStart < AuditDTim
THEN AuditRowId
END
FROM YourTable
ORDER BY AuditRowId
SELECT TOP 1 @AuditRowIdMax1 = AuditRowId,
@AuditRowIdMax2 = AuditRowId,
@AuditRowIdEnd = 1 + CASE
WHEN @AuditDTimEnd > AuditDTim
THEN AuditRowId
END
FROM YourTable
ORDER BY AuditRowId DESC
WHILE @AuditRowIdStart IS NULL
BEGIN
-- Binary search to find latest row where AuditDTim < @AuditDTimStart
SELECT TOP 1 @AuditRowIdMax1 = CASE
WHEN AuditDTim >= @AuditDTimStart
THEN AuditRowId
ELSE @AuditRowIdMax1
END,
@AuditRowIdMin1 = CASE
WHEN AuditDTim < @AuditDTimStart
THEN AuditRowId
ELSE @AuditRowIdMin1
END
FROM YourTable
WHERE AuditRowId <= @AuditRowIdMin1 + ((@AuditRowIdMax1 - @AuditRowIdMin1)/2)
ORDER BY AuditRowId DESC
IF @AuditRowIdMax1 - @AuditRowIdMin1 <= 1
SET @AuditRowIdStart = @AuditRowIdMin1;
END
WHILE @AuditRowIdEnd IS NULL
BEGIN
-- Binary search to find earliest row where AuditDTim > @AuditRowIdEnd
SELECT TOP 1 @AuditRowIdMax2 = CASE
WHEN AuditDTim > @AuditDTimEnd
THEN AuditRowId
ELSE @AuditRowIdMax2
END,
@AuditRowIdMin2 = CASE
WHEN AuditDTim <= @AuditDTimEnd
THEN AuditRowId
ELSE @AuditRowIdMin2
END
FROM YourTable
WHERE AuditRowId >= @AuditRowIdMin2 + ((@AuditRowIdMax2 - @AuditRowIdMin2)/2)
ORDER BY AuditRowId ASC
IF @AuditRowIdMax2 - @AuditRowIdMin2 <= 1
SET @AuditRowIdEnd = @AuditRowIdMax2;
END
SELECT *
FROM YourTable
WHERE AuditRowId > @AuditRowIdStart
AND AuditRowId < @AuditRowIdEnd
ORDER BY AuditRowId
Секционирование таблиц? – lad2025
Является ли AuditDTim соотнесенным с AuditRowId каким-либо образом? –
@ Мартин, Да, оба являются последовательными и инкрементальными по своей природе. Например, по мере увеличения AuditRowId AuditDTim будет либо одинаковым, либо увеличиваться. – Abin