Пока число остановок на линию не ожидается большим, вы можете использовать для этого треугольное соединение.
WITH BUSLines(LineID, DepartureTime) AS
(
SELECT 1, CAST('1900-01-01T10:00:00' AS DATETIME) UNION ALL
SELECT 2, CAST('1900-01-01T12:30:00' AS DATETIME)
),
BUSStops(LineID,StopID,Hour,Minute) AS
(
SELECT 1,1,0,40 UNION ALL
SELECT 1,2,0,10 UNION ALL
SELECT 2,1,0,30 UNION ALL
SELECT 2,2,0,27 UNION ALL
SELECT 2,3,1,15
)
SELECT BL.LineID,
BS1.StopID,
DATEADD(MINUTE,SUM(BS2.Minute),DATEADD(HOUR,SUM(BS2.Hour),BL.DepartureTime))
FROM BUSLines BL
JOIN BUSStops BS1 ON BL.LineID = BS1.LineID
JOIN BUSStops BS2 ON BL.LineID = BS2.LineID AND BS2.StopID <= BS1.StopID
GROUP BY BL.LineID, BL.DepartureTime, BS1.StopID