sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo realizar una interpolación lineal usando Oracle SQL?

No estoy seguro de cómo usarías PERCENTILE_CONT para hacer la interpolación que solicita, pero con la ayuda de una función analítica diferente puede lograr lo que desea.

En primer lugar, crearemos la siguiente función, que convierte INTERVAL DAY TO SECOND valores en segundos:

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

Con esta función podemos utilizar una consulta como la siguiente:

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;

Tomé sus datos anteriores, configuré el componente de fecha de las marcas de tiempo para hoy y obtuve los siguientes resultados cuando ejecuté la consulta anterior:

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

(Agregué un TO_CHAR alrededor de d1.time para reducir el espacio excesivo en SQL*Plus.)

Si estás usando DATE s en lugar de TIMESTAMP s, no necesita la función:simplemente puede restar las fechas.