114 lines
3.6 KiB
PL/PgSQL
114 lines
3.6 KiB
PL/PgSQL
create table rt_totalizer_result (
|
|
day date,
|
|
device text,
|
|
total double precision
|
|
);
|
|
|
|
select total_energy_by_day_and_device('2021-05-01','2021-05-10','Computer');
|
|
|
|
create or replace function total_energy_by_day_and_device(p_start_day date, p_end_say date, p_device varchar)
|
|
returns setof rt_totalizer_result
|
|
language plpgsql
|
|
as $$
|
|
declare
|
|
v_firstEnergy double precision;
|
|
v_lastEnergy double precision;
|
|
v_total double precision;
|
|
v_day date;
|
|
v_result rt_totalizer_result%rowtype;
|
|
begin
|
|
v_day := p_start_day;
|
|
loop
|
|
select energy
|
|
into v_lastEnergy
|
|
from power_measurement_t
|
|
where time = (
|
|
select max(time)
|
|
from power_measurement_t
|
|
where time between v_day + time '00:00' and v_day + time '00:00' + interval '24h' and
|
|
deviceid = p_device and
|
|
status = 'Ok'
|
|
) and
|
|
deviceid = p_device;
|
|
select energy
|
|
into v_firstEnergy
|
|
from power_measurement_t
|
|
where time = (
|
|
select min(time)
|
|
from power_measurement_t
|
|
where time between v_day + time '00:00' and v_day + time '00:00' + interval '24h' and
|
|
deviceid = p_device and
|
|
status = 'Ok'
|
|
) and
|
|
deviceid = p_device;
|
|
v_total := v_lastEnergy - v_firstEnergy;
|
|
|
|
v_result.day := v_day;
|
|
v_result.device := p_device;
|
|
v_result.total := v_total;
|
|
return next v_result;
|
|
v_day := v_day + interval '1 day';
|
|
exit when v_day > p_end_say;
|
|
end loop;
|
|
return;
|
|
end;
|
|
$$;
|
|
|
|
|
|
select total_energy('2021-05-01','2021-05-10');
|
|
|
|
create or replace function total_energy(p_start_day date, p_end_say date)
|
|
returns setof rt_totalizer_result
|
|
language plpgsql
|
|
as $$
|
|
declare
|
|
v_firstEnergy double precision;
|
|
v_lastEnergy double precision;
|
|
v_total double precision;
|
|
v_day date;
|
|
v_deviceid text;
|
|
v_result rt_totalizer_result%rowtype;
|
|
begin
|
|
for v_deviceid in select distinct deviceid
|
|
from power_measurement_t
|
|
loop
|
|
v_day := p_start_day;
|
|
loop
|
|
select energy
|
|
into v_lastEnergy
|
|
from power_measurement_t
|
|
where time = (
|
|
select max(time)
|
|
from power_measurement_t
|
|
where time between v_day + time '00:00' and v_day + time '00:00' + interval '24h' and
|
|
deviceid = v_deviceid and
|
|
status = 'Ok'
|
|
) and
|
|
deviceid = v_deviceid;
|
|
select energy
|
|
into v_firstEnergy
|
|
from power_measurement_t
|
|
where time = (
|
|
select min(time)
|
|
from power_measurement_t
|
|
where time between v_day + time '00:00' and v_day + time '00:00' + interval '24h' and
|
|
deviceid = v_deviceid and
|
|
status = 'Ok'
|
|
) and
|
|
deviceid = v_deviceid;
|
|
v_total := v_lastEnergy - v_firstEnergy;
|
|
|
|
v_result.day := v_day;
|
|
v_result.device := v_deviceid;
|
|
v_result.total := v_total;
|
|
return next v_result;
|
|
v_day := v_day + interval '1 day';
|
|
exit when v_day > p_end_say;
|
|
end loop;
|
|
end loop;
|
|
return;
|
|
end;
|
|
$$;
|
|
|
|
|