Предполагая некоторые параметры здесь:
;WITH Date_Ranges AS (
SELECT
@min_datetime AS start_datetime,
DATEADD(SECOND, @seconds,
DATEADD(MINUTE, @minutes,
DATEADD(HOUR, @hours,
DATEADD(DAY, @days,
DATEADD(WEEK, @weeks,
DATEADD(MONTH, @months,
DATEADD(YEAR, @years, @min_datetime))))))) AS end_datetime
UNION ALL
SELECT
DATEADD(SECOND, 1, end_datetime),
DATEADD(SECOND, @seconds,
DATEADD(MINUTE, @minutes,
DATEADD(HOUR, @hours,
DATEADD(DAY, @days,
DATEADD(WEEK, @weeks,
DATEADD(MONTH, @months,
DATEADD(YEAR, @years, end_datetime)))))))
FROM
Date_Ranges
WHERE
DATEADD(SECOND, 1, end_datetime) < @max_datetime
)
SELECT
DR.min_datetime,
DR.max_datetime,
AVG([Open]),
AVG([Close]),
AVG([Min]),
AVG([Max])
FROM
Date_Ranges DR
LEFT OUTER JOIN Quote_History QH ON
QH.id BETWEEN DR.min_datetime AND DR.max_datetime
GROUP BY
DR.min_datetime,
DR.max_datetime
ORDER BY
DR.min_datetime,
DR.max_datetime
Возможно, вам придется поработать над тем, как обрабатывать крайние случаи (этот диапазон в 1 секунду между диапазонами дат может быть проблемой в зависимости от ваших данных). Надеюсь, это должно направить вас в правильном направлении.