Oracle
 sql >> база данни >  >> RDS >> Oracle

Как мога да извърша линейна интерполация с помощта на oracle SQL?

Не съм сигурен как бихте използвали PERCENTILE_CONT за да направите интерполацията, която поискате, но с помощта на различна аналитична функция можете да постигнете това, което искате.

Първо, ще създадем следната функция, която преобразува INTERVAL DAY TO SECOND стойности в секунди:

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

С тази функция можем да използваме заявка като следната:

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;

Взех вашите данни по-горе, зададох компонента за дата на времевите клейма на днес и получих следните резултати, когато изпълних заявката по-горе:

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

(Добавих TO_CHAR около d1.time за намаляване на прекомерното разстояние в SQL*Plus.)

Ако използвате DATE s вместо TIMESTAMP s, нямате нужда от функцията:можете просто да извадите датите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Политика за корекция

  2. Oracle -- намиране на стойности с водещи или завършващи интервали

  3. Намерете всички нечислови стойности в колона в Oracle

  4. PreparedStatement и setTimestamp в oracle jdbc

  5. Създаване на нов атрибут в база данни на Oracle от два други атрибута