sql >> Databáze >  >> RDS >> Oracle

Jak mohu provést lineární interpolaci pomocí Oracle SQL?

Nejsem si jistý, jak byste použili PERCENTILE_CONT provést interpolaci, kterou požadujete, ale s pomocí jiné analytické funkce můžete dosáhnout toho, co chcete.

Nejprve vytvoříme následující funkci, která převede INTERVAL DAY TO SECOND hodnoty v sekundách:

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

Pomocí této funkce můžeme použít dotaz, jako je tento:

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;
 

Vzal jsem vaše data výše, nastavil komponentu data časových razítek na dnešek a při spuštění výše uvedeného dotazu jsem získal následující výsledky:

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 03.050.01 03.050.01 

(Přidal jsem TO_CHAR kolem d1.time snížit nadměrné mezery v SQL*Plus.)

Pokud používáte DATE s namísto TIMESTAMP s, tuto funkci nepotřebujete:stačí odečíst data.



  1. mySQL - porovnání latinského (anglického) vstupního formuláře s daty utf8 (neanglickými).

  2. Opakující se události, SQL dotaz

  3. Které DBMS umožňují řazení podle atributu, který není obsažen v klauzuli select?

  4. Aktualizace z MYSQL na MYSQLI