Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để thực hiện nội suy tuyến tính bằng SQL oracle?

Tôi không chắc cách bạn sử dụng PERCENTILE_CONT để thực hiện phép nội suy mà bạn yêu cầu, nhưng với sự trợ giúp của một hàm phân tích khác, bạn có thể đạt được điều mình muốn.

Đầu tiên, chúng ta sẽ tạo một hàm sau, hàm này chuyển đổi INTERVAL DAY TO SECOND giá trị tính bằng giây:

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

Với hàm này, chúng ta có thể sử dụng một truy vấn như sau:

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;

Tôi đã lấy dữ liệu của bạn ở trên, đặt thành phần ngày của dấu thời gian thành hôm nay và tôi nhận được kết quả sau khi chạy truy vấn ở trên:

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

(Tôi đã thêm một TO_CHAR khoảng d1.time để cắt giảm khoảng cách quá mức trong SQL * Plus.)

Nếu bạn đang sử dụng DATE s thay vì TIMESTAMP s, bạn không cần hàm:bạn chỉ có thể trừ ngày.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi đang cố gắng đạt được kết quả đầu ra dưới mức

  2. Nhận đầu ra từ dbms_output.get_lines bằng JDBC

  3. Nhập tệp CSV vào Bảng bên ngoài Oracle

  4. Làm cách nào để bạn nhận được các kết quả được định dạng độc đáo từ một thủ tục Oracle trả về một con trỏ tham chiếu?

  5. Oracle:liên kết tất cả truy vấn 1 và truy vấn 2 muốn trừ một số hàng nếu truy vấn 1 có dữ liệu hàng