PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách tối ưu hóa truy vấn SQL với các hàm cửa sổ

Tôi sẽ cố gắng chuyển một số phần tính toán sang giai đoạn chèn hàng.

Thêm một cột mới:

alter table measurements add consumption real;

Cập nhật cột:

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;

Tạo trình kích hoạt:

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

Truy vấn:

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. Làm thế nào để thiết lập PostgreSQL cho Play 2.0?

  2. PostgreSQL - Quartz JDBC-JobStoreTX - getTriggersForJob - ArrayIndexOutOfBoundsException

  3. Ruby:Cách thay thế động các tham số trong PG nguyên bản

  4. Rails:Không có nhóm kết nối cho ActiveRecord ::Base

  5. cập nhật dữ liệu xml bằng truy vấn sql trên postgresql