PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zoptymalizować zapytanie SQL za pomocą funkcji okna

Spróbowałbym przenieść część obliczeń do fazy wstawiania wiersza.

Dodaj nową kolumnę:

alter table measurements add consumption real;

Zaktualizuj kolumnę:

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;

Utwórz wyzwalacz:

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();

Zapytanie:

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. Jak czytać składnię dokumentacji poleceń PostgreSQL?

  2. Jak wydajne jest zamawianie według odległości (cała tabela) w geodjango

  3. Jak określić ostatni dzień poprzedniego miesiąca za pomocą PostgreSQL?

  4. postgres regexp_replace zezwala tylko na a-z i A-Z

  5. Dziwne zachowanie w Postgresql