The following query should give you a start.
SELECT DISTINCT Disp, ( CASE WHEN [Open] IS NOT NULL THEN [Open] ELSE (SELECT TOP 1 PRICE FROM @Table WHERE Datepart(MINUTE, TradeTime) / 10 < O.Diff ) END ) AS [Open] ,( CASE WHEN O.[Open] IS NOT NULL THEN [Open] ELSE (SELECT TOP 1 PRICE FROM @Table WHERE Datepart(MINUTE, TradeTime) / 10 < O.Diff ) END ) AS [Close] FROM ( SELECT D.Disp ,D.Diff ,FIRST_VALUE(Price) OVER (PARTITION BY GRP ORDER BY TradeTime ASC) AS [Open] ,FIRST_VALUE(Price) OVER (PARTITION BY GRP ORDER BY TradeTime DESC) AS [Close], TradeTime FROM (VALUES (0,'00:01->00:10'), (1,'00:10->00:20'), (2,'00:20->00:30'), (3,'00:30->00:40'), (4,'00:40->00:50'), (5,'00:50->00:59') ) D(Diff,Disp) LEFT JOIN (SELECT Datepart(MINUTE, TradeTime) / 10 AS GRP, TradeTime, Price FROM @Table GROUP BY Datepart(MINUTE, TradeTime) / 10, TradeTime, Price) T ON T.GRP = D.Diff ) O
Full example:
DECLARE @Table TABLE(TradeTime DATETIME, Price DECIMAL(15,2)) INSERT INTO @Table SELECT * FROM (VALUES (CAST('2018-02-18 13:04:46.920' AS DATETIME) , 647.24) ,(CAST('2018-02-18 13:05:46.920' AS DATETIME) , 700.18) ,(CAST('2018-02-18 13:15:46.920' AS DATETIME) , 750.23) ,(CAST('2018-02-18 13:24:46.920' AS DATETIME) , 767.81) ,(CAST('2018-02-18 14:26:46.920' AS DATETIME) , 711.46) ) TAB(TradeTime, Price) SELECT DISTINCT Disp, ( CASE WHEN [Open] IS NOT NULL THEN [Open] ELSE (SELECT TOP 1 PRICE FROM @Table WHERE Datepart(MINUTE, TradeTime) / 10 < O.Diff ) END ) AS [Open] ,( CASE WHEN O.[Open] IS NOT NULL THEN [Open] ELSE (SELECT TOP 1 PRICE FROM @Table WHERE Datepart(MINUTE, TradeTime) / 10 < O.Diff ) END ) AS [Close] FROM ( SELECT D.Disp ,D.Diff ,FIRST_VALUE(Price) OVER (PARTITION BY GRP ORDER BY TradeTime ASC) AS [Open] ,FIRST_VALUE(Price) OVER (PARTITION BY GRP ORDER BY TradeTime DESC) AS [Close], TradeTime FROM (VALUES (0,'00:00->00:10'), (1,'00:10->00:20'), (2,'00:20->00:30'), (3,'00:30->00:40'), (4,'00:40->00:50'), (5,'00:50->00:59') ) D(Diff,Disp) LEFT JOIN (SELECT Datepart(MINUTE, TradeTime) / 10 AS GRP, TradeTime, Price FROM @Table GROUP BY Datepart(MINUTE, TradeTime) / 10, TradeTime, Price) T ON T.GRP = D.Diff ) O
Output result
Disp Open Close -------------------------------------- 00:00->00:10 647.24 647.24 00:10->00:20 750.23 750.23 00:20->00:30 767.81 767.81 00:30->00:40 647.24 47.24 00:40->00:50 647.24 647.24 00:50->00:59 647.24 647.24