я не могу видеть в любом случае, чтобы приблизиться к этому, кроме как в два этапа, сначала в качестве gaps and islands problem определить ваши острова, чтобы подвести итог, то, чтобы сделать сумму. Так первые острова:
DECLARE @T TABLE (run_key INT, time_empty INT, Col1 INT, Col2 INT)
INSERT @T (run_key, time_empty)
VALUES
(1, 637), (2, NULL), (3, NULL), (4, NULL),
(5, 2967), (6, 1000), (7, NULL), (8, NULL);
SELECT run_key,
time_empty,
IslandID = ROW_NUMBER() OVER(ORDER BY Run_key) -
ROW_NUMBER()
OVER(PARTITION BY
Col1,
Col2,
CASE WHEN time_empty IS NULL THEN 1 ELSE 0 END
ORDER BY Run_key)
FROM @T
ORDER BY run_key;
Что дает:
run_key time_empty IslandID
------------------------------
1 637 0
2 NULL 1
3 NULL 1
4 NULL 1
5 2967 3
6 1000 3
7 NULL 3
8 NULL 3
Теперь это дает вам колонку (IslandID
), чтобы раздел на который будет правильно сбросить сумму в следующем, не нуль:
DECLARE @T TABLE (run_key INT, time_empty INT, Col1 INT, Col2 INT)
INSERT @T (run_key, time_empty)
VALUES
(1, 637), (2, NULL), (3, NULL), (4, NULL),
(5, 2967), (6, 1000), (7, NULL), (8, NULL);
SELECT run_key,
time_empty,
time_empty_rt = CASE WHEN time_empty IS NULL THEN NULL
ELSE SUM(time_empty)
OVER (PARTITION BY Col1, Col2, IslandID
ORDER BY run_key
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
END
FROM ( SELECT run_key,
time_empty,
Col1,
Col2,
IslandID = ROW_NUMBER() OVER(ORDER BY Run_key)
- ROW_NUMBER()
OVER(PARTITION BY
Col1,
Col2,
CASE WHEN time_empty IS NULL THEN 1 ELSE 0 END
ORDER BY Run_key)
FROM @T
) AS t;
Предоставить образец данных, что вы выбрать и проверить мой ответ. –