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. PostgreSQL में INSERT या UPDATE से प्रभावित रिकॉर्ड्स की संख्या प्राप्त करें

  2. रेल्स एक्टिवरेकॉर्ड/पोस्टग्रेज टाइम फॉर्मेट

  3. अजगर का उपयोग करके उसकेोकू में पोस्टग्रेस्क्ल से कनेक्ट करते समय डीजे-डेटाबेस-यूआरएल का उपयोग कैसे करें

  4. प्लेसहोल्डर के रूप में प्रश्न चिह्न की व्याख्या करने से पीडीओ को कैसे रोकें?

  5. समय सीमा के अनुसार डेटास्टोर में पंक्तियों को हटाना