Первое, что нужно сделать, это сгруппировать по диапазонам времени:
SELECT MIN(BarTimeStamp) AS StartTimeStamp,
MAX(BarTimeStamp) AS EndTimeStamp
FROM #TimeBar
WHERE Instrument = 'TEST'
GROUP BY DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY, BarTimeStamp), DATEPART(HOUR, BarTimeStamp)
После этого необходимо:
- сделать объединение для получения диапазонов,
- делает объединение для начала
- выполняет объединение для получения минимальной
- группировки по исходному диапазону для выбора всего
Мне нравитсячтобы использовать простые табличные выражения, чтобы упростить задачу:
;WITH times as (
SELECT MIN(BarTimeStamp) AS StartTimeStamp,
MAX(BarTimeStamp) AS EndTimeStamp
FROM #TimeBar
WHERE Instrument = 'TEST'
GROUP BY DATEPART(YEAR, BarTimeStamp), DATEPART(MONTH, BarTimeStamp), DATEPART(DAY, BarTimeStamp), DATEPART(HOUR, BarTimeStamp)
)
SELECT
StartTimeStamp as TimeStamp
,MIN([first].[Open]) as [Open]
,MAX(ranged.High) as High
,MAX(ranged.Low) as Low
,MIN([last].[Close]) as [Close]
,SUM(ranged.Volume) as Volume
FROM times
INNER JOIN #TimeBar ranged ON times.StartTimeStamp <= ranged.BarTimeStamp AND times.EndTimeStamp >= ranged.BarTimeStamp
INNER JOIN #TimeBar [first] ON times.StartTimeStamp = [first].BarTimeStamp
INNER JOIN #TimeBar [last] ON times.EndTimeStamp = [last].BarTimeStamp
GROUP BY [times].StartTimeStamp
Вот мои тестовые данные:
CREATE TABLE #TimeBar (
Instrument varchar(20),
BarTimeStamp datetimeoffset(7),
[Open] decimal(18, 5),
High decimal(18, 5),
Low decimal(18, 5),
[Close] decimal(18, 5),
Volume int
)
insert into #TimeBar values ('TEST', '2011-11-21 1:00', 5, 6, 4, 8, 100)
insert into #TimeBar values ('TEST', '2011-11-21 1:10', 1, 7, 3, 4, 100)
insert into #TimeBar values ('TEST', '2011-11-21 2:10', 15, 16, 17, 18, 100)
insert into #TimeBar values ('TEST', '2011-11-21 2:30', 12, 16, 17, 19, 100)
insert into #TimeBar values ('TEST', '2011-11-21 2:50', 13, 14, 15, 20, 100)
и результат:
TimeStamp Open High Low Close Volume
---------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- -----------
2011-11-21 01:00:00.0000000 +00:00 5.00000 7.00000 4.00000 4.00000 200
2011-11-21 02:10:00.0000000 +00:00 15.00000 16.00000 17.00000 20.00000 300
Обратите внимание, яиспользовал временную таблицу для этого, просто измените #TimeBar на TimeBar, чтобы изменить его для вашей реальной таблицы.
Кроме того, я не хотел бы видеть Instrurment varchar
в качестве определения поля.Для этого вы должны использовать суррогатный ключ .