PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да оптимизирате SQL заявка с прозоречни функции

Бих се опитал да преместя част от изчисленията във фазата на вмъкване на ред.

Добавете нова колона:

alter table measurements add consumption real;

Актуализирайте колоната:

with m1 as (
    select
        id, power_total, created_at,
        lag(power_total) over (partition by device_id order by created_at) prev_power_total,
        lag(created_at) over (partition by device_id order by created_at) prev_created_at
    from measurements
    )
update measurements m2
set consumption = 
    (m1.power_total+ m1.prev_power_total)*
    extract(epoch from m1.created_at- m1.prev_created_at)
from m1
where m2.id = m1.id;

Създайте тригер:

create or replace function before_insert_on_measurements()
returns trigger language plpgsql
as $$
declare
    rec record;
begin
    select power_total, created_at into rec
    from measurements
    where device_id = new.device_id
    order by created_at desc
    limit 1;
    new.consumption:= 
        (new.power_total+ rec.power_total)*
        extract(epoch from new.created_at- rec.created_at);
    return new;
end $$;

create trigger before_insert_on_measurements
before insert on measurements
for each row execute procedure before_insert_on_measurements();

Заявката:

select device_id, sum(consumption) total_consumption
from measurements
-- where conditions
group by 1
order by 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам RETURNING с ON CONFLICT в PostgreSQL?

  2. Използване на symfony с postgresql

  3. Таблица за връщане на съхранена процедура на Postgresql всички колони

  4. Защо Postgres казва, че колоната не съществува?

  5. Използвайте where заявки в тип данни JSONB в Rails Postgres