Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana saya bisa melakukan interpolasi linier menggunakan Oracle SQL?

Saya tidak yakin bagaimana Anda akan menggunakan PERCENTILE_CONT untuk melakukan interpolasi yang Anda minta, tetapi dengan bantuan fungsi analitik yang berbeda, Anda dapat mencapai apa yang Anda inginkan.

Pertama, kita akan membuat fungsi berikut, yang mengubah INTERVAL DAY TO SECOND nilai menjadi detik:

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

Dengan fungsi ini kita dapat menggunakan query seperti berikut:

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;

Saya mengambil data Anda di atas, menyetel komponen tanggal dari stempel waktu ke hari ini, dan saya mendapatkan hasil berikut saat menjalankan kueri di atas:

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

(Saya menambahkan TO_CHAR sekitar d1.time untuk mengurangi spasi yang berlebihan di SQL*Plus.)

Jika Anda menggunakan DATE s bukannya TIMESTAMP s, Anda tidak memerlukan fungsinya:Anda cukup mengurangi tanggalnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01843:bukan bulan yang valid saat memasukkan tanggal di oracle

  2. Bagaimana cara menerapkan pemicu ini pada Oracle SQL?

  3. Parameter OUT prosedur tersimpan Oracle

  4. Oracle, cara membuka kursor dan memilih satu kolom dari banyak menjadi variabel

  5. ORA-00604:kesalahan terjadi pada SQL rekursif level 1