select p.endpoint_id,
p.mode_start as event_start,
(p.mode_start + p.mode_duration) as event_end,
sum(e.kwh) as sum_kwh
from periods p
join energy e on e.endpoint_id = p.endpoint_id -- связываем выставленный период для прибора с показаниями прибора
and p.mode_start <= e.event_time -- связывание начало периода с моментом замера
and (p.mode_start + p.mode_duration) > e.event_time -- связывание конца периода с моментом замера
group by p.endpoint_id, p.mode_start, (p.mode_start + p.mode_duration)
order by p.endpoint_id, p.mode_start
Примечание.
1. Запрос составлен без отладки, требуется отладка.
2. Если периоды накладываются у одного и того же прибора, то замер, в интервале где происходит накладка, попадет в сумму в обоих периодах.
3. Если для событий не прописан период, то они не будут учитываться. Можно написать такую связку через left join так: "... energy e
left join periods p on ... ", тогда сумма неучтенной энергии упадет в отдельную строку, в которой будет отсутствовать период.
Запрос для вывода неучтенных замеров:
select e.endpoint_id,
p.mode_start as event_start,
(p.mode_start + p.mode_duration) as event_end,
sum(e.kwh) as sum_kwh
from energy e
left join periods p on e.endpoint_id = p.endpoint_id
and p.mode_start <= e.event_time
and (p.mode_start + p.mode_duration) > e.event_time
group by e.endpoint_id, p.mode_start, (p.mode_start + p.mode_duration)
order by e.endpoint_id,
p.mode_start nulls first -- ставим первой строкой сумму замеров с неучтенными значениями (в пределах одного прибора)