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. WHERE句の後にJOINが続く

    2. Oracleは、解析された文字列/clob行から複数​​のサブ文字列を返す方法を提供していますか?

    3. MySQLでCASEステートメントを使用する方法は?

    4. Pythonは、すべてを設定した後、HerokuでODBCドライバーを見つけることができません