Используйте sum
оконную функцию, чтобы получить сумму для entity_id и first_value
, чтобы получить самый старый и самый новый item_id на основе желаемого порядка в month_id.
select distinct entity_id,oldest_item_id,newest_item_id,signal_count_sum
from (select t.*
,sum(signal_count) over(partition by entity_id) as signal_sum
,first_value(item_id) over(partition by entity_id order by month_id) as oldest_item_id
,first_value(item_id) over(partition by entity_id order by month_id desc) as newest_item_id
from tbl t
) t
Чтобы разорвать связи и получить наименьший item_idв случае наличия нескольких строк с одинаковым month_id для entity_id добавьте item_id
к order by
со спецификацией rows
.
select distinct entity_id,oldest_item_id,newest_item_id,signal_count_sum
from (select t.*
,sum(signal_count) over(partition by entity_id) as signal_sum
,first_value(item_id) over(partition by entity_id order by month_id,item_id rows unbounded preceding) as oldest_item_id
,first_value(item_id) over(partition by entity_id order by month_id desc,item_id rows unbounded preceding) as newest_item_id
from tbl t
) t