Еще один способ решения этой задачи:
WITH (SELECT arraySort(groupArray(rn))
FROM test_table
WHERE ne = 0) as group_start_id
SELECT argMin(date, rn) start, argMax(date, rn) end, sum(change)
FROM (
SELECT rn, date, change
FROM test_table
ORDER BY rn)
GROUP BY arrayFirstIndex(x -> rn < x, group_start_id)
ORDER BY start
Тестирование на примере данных:
WITH (SELECT arraySort(groupArray(rn))
FROM (
SELECT data.1 rn, data.2 date, data.3 ne, data.4 change
FROM (
SELECT arrayJoin([
(0, toDate('2008-12-07'), 0, toInt64(-10330848398)),
(1, toDate('2009-04-14'), 1, toInt64(-61290)),
(2, toDate('2009-04-26'), 1, toInt64(9605743360)),
(3, toDate('2013-07-06'), 0, toInt64(-32028871920)),
(4, toDate('2014-01-12'), 1, toInt64(-42296164902)),
(5, toDate('2015-06-08'), 1, toInt64(59100383646)),
(6, toDate('2015-06-08'), 0, toInt64(101)),
(7, toDate('2015-06-09'), 0, toInt64(102)),
(8, toDate('2015-06-10'), 0, toInt64(103)),
(9, toDate('2015-06-11'), 1, toInt64(104))
]) data))
WHERE ne = 0) as group_start_id
SELECT argMin(date, rn) start, argMax(date, rn) end, sum(change)
FROM (
SELECT data.1 rn, data.2 date, data.4 change
FROM (
SELECT arrayJoin([
(0, toDate('2008-12-07'), 0, toInt64(-10330848398)),
(1, toDate('2009-04-14'), 1, toInt64(-61290)),
(2, toDate('2009-04-26'), 1, toInt64(9605743360)),
(3, toDate('2013-07-06'), 0, toInt64(-32028871920)),
(4, toDate('2014-01-12'), 1, toInt64(-42296164902)),
(5, toDate('2015-06-08'), 1, toInt64(59100383646)),
(6, toDate('2015-06-08'), 0, toInt64(101)),
(7, toDate('2015-06-09'), 0, toInt64(102)),
(8, toDate('2015-06-10'), 0, toInt64(103)),
(9, toDate('2015-06-11'), 1, toInt64(104))
]) data)
ORDER BY rn)
GROUP BY arrayFirstIndex(x -> rn < x, group_start_id)
ORDER BY start
/* result
┌──────start─┬────────end─┬──sum(change)─┐
│ 2008-12-07 │ 2009-04-26 │ -725166328 │
│ 2013-07-06 │ 2015-06-08 │ -15224653176 │
│ 2015-06-08 │ 2015-06-08 │ 101 │
│ 2015-06-09 │ 2015-06-09 │ 102 │
│ 2015-06-10 │ 2015-06-11 │ 207 │
└────────────┴────────────┴──────────────┘
*/