Это типичные пробелы и проблема острова.
Для начала: имейте в виду, что SQL таблицы представляют неупорядоченный набор строк. Так что для решения вашего вопроса вам нужен столбец, который определяет порядок строк в таблице - я предположил ordering_id
.
Вот подход, который использует разницу между row_numbers()
для построения групп смежных строк, имеющих одинаковые id
:
select
id,
sum(value) value
from (
select
t.*,
row_number() over(order by ordering_id) rn1
row_number() over(partition by id order by ordering_id) rn2
from mytable t
) t
group by id, rn1 - rn2
Если вы хотите это на для пользователя :
select
user,
id,
sum(value) value
from (
select
t.*,
row_number() over(partition by user order by ordering_id) rn1
row_number() over(partition by user, id order by ordering_id) rn2
from mytable t
) t
group by user, id, rn1 - rn2