Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wykonać interpolację liniową za pomocą Oracle SQL?

Nie wiem, jak użyć PERCENTILE_CONT wykonać interpolację, o którą prosisz, ale z pomocą innej funkcji analitycznej możesz osiągnąć to, czego chcesz.

Najpierw utworzymy następującą funkcję, która konwertuje INTERVAL DAY TO SECOND wartości w sekundach:

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

Za pomocą tej funkcji możemy użyć zapytania takiego jak:

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;

Wziąłem powyższe dane, ustawiłem składnik daty sygnatur czasowych na dzisiaj i po uruchomieniu powyższego zapytania otrzymałem następujące wyniki:

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

(Dodałem TO_CHAR w okolicy d1.time aby zmniejszyć nadmierne odstępy w SQL*Plus.)

Jeśli używasz DATE s zamiast TIMESTAMP s, nie potrzebujesz funkcji:możesz po prostu odjąć daty.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamicznie generuj wyrażenie lambda ze stałymi ze zmiennych

  2. Dlaczego otrzymuję błąd Oracle podczas wywoływania procedury z C#?

  3. Program ładujący SQL, nasycenie wyzwalacza?

  4. Używanie Babel w produkcji - Jak prekompilować skrypty

  5. Oblicz procent korzenia posiadanego przez jego rodziców