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. SQL:基準を満たす関連付けのないレコードのみを返します

    2. TABLOCK vs TABLOCKX

    3. RPostgreSQL-AmazonRedshiftへのR接続-より大きなデータセットを書き込む/投稿する方法

    4. Wampserverへのデータベースのインポートで発生した1064SQLエラーの修正