sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag utföra linjär interpolation med Oracle SQL?

Jag är inte säker på hur du skulle använda PERCENTILE_CONT att göra den interpolation du ber om, men med hjälp av en annan analytisk funktion kan du uppnå vad du vill.

Först skapar vi följande funktion, som konverterar INTERVAL DAY TO SECOND värden i sekunder:

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;
/
 

Med den här funktionen kan vi använda en fråga som följande:

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;
 

Jag tog din data ovan, ställde in datumkomponenten för tidsstämplarna till idag, och jag fick följande resultat när jag körde frågan ovan:

TO_CHAR(D1.TIME) VALUE1 VALUE2------------------------------------------- -- -------- ----------09-SEP-11 01.00.00.000000 109-SEP-11 01.00.01.000000 1.03 552.51762509-SEP-11 01.00.02.000000 4.41.>pre 

(Jag lade till en TO_CHAR runt d1.time för att minska på överdrivet mellanrum i SQL*Plus.)

Om du använder DATE s istället för TIMESTAMP s, du behöver inte funktionen:du kan bara subtrahera datumen.



  1. Fråga efter inlägg och taggar i samma fråga

  2. java anslutningssträng för att stödja oracle TAF-funktion

  3. Hur skapar jag en tillfällig tabell i SQL?

  4. CASE WHEN in WHERE-satsen misslyckas med ett fel som saknar nyckelord