sql >> Database >  >> RDS >> Oracle

Hoe kan ik lineaire interpolatie uitvoeren met Oracle SQL?

Ik weet niet zeker hoe je PERCENTILE_CONT . zou gebruiken om de interpolatie te doen waar je om vraagt, maar met behulp van een andere analytische functie kun je bereiken wat je wilt.

Eerst maken we de volgende functie, die INTERVAL DAY TO SECOND omzet waarden in seconden:

CREATE OR REPLACE FUNCTION intvl_to_seconds(
    p_interval INTERVAL DAY TO SECOND
) RETURN NUMBER DETERMINISTIC
AS
BEGIN
  RETURN EXTRACT(DAY FROM p_interval) * 24*60*60
       + EXTRACT(HOUR FROM p_interval) * 60*60
       + EXTRACT(MINUTE FROM p_interval) * 60
       + EXTRACT(SECOND FROM p_interval);
END;
/

Met deze functie kunnen we een query gebruiken zoals de volgende:

SELECT d1.time,
       d1.value AS value1,
       q2.prev_value + intvl_to_seconds(d1.time - q2.prev_time) * (q2.next_value - q2.prev_value)/intvl_to_seconds(q2.next_time - q2.prev_time) AS value2
  FROM devices d1
  LEFT OUTER JOIN (SELECT d2.time AS prev_time,
                          d2.value AS prev_value,
                          LEAD(d2.time, 1) OVER (ORDER BY d2.time) AS next_time,
                          LEAD(d2.value, 1) OVER (ORDER BY d2.time) AS next_value
                     FROM devices d2
                    WHERE d2.deviceid = 2) q2
               ON d1.time BETWEEN q2.prev_time AND q2.next_time
 WHERE d1.deviceid = 1;

Ik heb je gegevens hierboven genomen, de datumcomponent van de tijdstempels ingesteld op vandaag en ik kreeg de volgende resultaten toen ik de bovenstaande zoekopdracht uitvoerde:

TO_CHAR(D1.TIME)                          VALUE1     VALUE2
------------------------------------- ---------- ----------
09-SEP-11 01.00.00.000000                      1
09-SEP-11 01.00.01.000000                   1.03 552.517625
09-SEP-11 01.00.02.000000                  1.063 552.404813

(Ik heb een TO_CHAR toegevoegd rond d1.time om buitensporige spatiëring in SQL*Plus te verminderen.)

Als u DATE gebruikt s in plaats van TIMESTAMP s, je hebt de functie niet nodig:je kunt gewoon de datums aftrekken.



  1. Voer Sequelize-query's synchroon uit

  2. Php-script UTF8 invoegen IN MYSQL

  3. Postgres-beperking die ervoor zorgt dat één kolom van vele aanwezig is?

  4. Hoe opgeslagen procedures in SQL maken?