sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kan jeg udføre lineær interpolation ved hjælp af oracle SQL?

Jeg er ikke sikker på, hvordan du ville bruge PERCENTILE_CONT at lave den interpolation, du beder om, men ved hjælp af en anden analytisk funktion kan du opnå det, du ønsker.

Først vil vi oprette følgende funktion, som konverterer INTERVAL DAY TO SECOND værdier 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 denne funktion kan vi bruge en forespørgsel som f.eks. følgende:

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;
 

Jeg tog dine data ovenfor, indstillede datokomponenten for tidsstemplerne til i dag, og jeg fik følgende resultater, da jeg kørte forespørgslen ovenfor:

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. 

(Jeg tilføjede en TO_CHAR omkring d1.time for at skære ned på overdreven afstand i SQL*Plus.)

Hvis du bruger DATE s i stedet for TIMESTAMP s, du behøver ikke funktionen:du kan bare trække datoerne fra.



  1. Sådan administrerer du brugere og godkendelse i MySQL

  2. 2 funktioner, der returnerer måneden fra en dato i Oracle

  3. Installation og arbejde med MySQL 5 på Windows 7

  4. PostgreSQL hvordan opretter man en kopi af en database eller et skema?