6

パーセンタイル関数のいずれかでウィンドウ関数を使用することは可能ですか?または、ローリングパーセンタイル値を取得するための回避策を知っていますか?

移動平均で簡単です:

select avg(foo) over (order by foo_date rows 
                      between 20 preceding and 1 preceding) foo_avg_ma
from foo_tab

しかし、同じウィンドウで中央値(50%パーセンタイル)を取得する方法がわかりません。

4

1 に答える 1

6

PERCENTILE_CONTまたはPERCENTILE_DISC 関数を使用して、中央値を見つけることができます。

PERCENTILE_CONTは、連続分布モデルを想定した逆分布関数です。パーセンタイル値とソート仕様を取り、ソート仕様に関してそのパーセンタイル値に分類される補間値を返します。ヌルは計算で無視されます。

..。

PERCENTILE_DISCは、離散分布モデルを想定した逆分布関数です。パーセンタイル値とソート指定を受け取り、セットから要素を返します。ヌルは計算で無視されます。

..。

次の例では、各部門の給与の中央値を計算します。

SELECT department_id,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median cont",
       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median disc"
  FROM employees
  GROUP BY department_id
  ORDER BY department_id;

..。

PERCENTILE_CONTとPERCENTILE_DISCは異なる結果を返す場合があります。PERCENTILE_CONTは、線形補間を実行した後に計算結果を返します。PERCENTILE_DISCは、集計された値のセットから値を返すだけです。この例のように、パーセンタイル値が0.5の場合、PERCENTILE_CONTは、要素の数が偶数のグループの2つの中間値の平均を返しますが、PERCENTILE_DISCは、2つの中間値の最初の値を返します。要素の数が奇数の集合グループの場合、両方の関数が中央の要素の値を返します。

ウィンドウシミュレーショントラフ範囲の自己結合を備えたサンプル

with sample_data as (
        select /*+materialize*/ora_hash(owner) as table_key,object_name,
            row_number() over (partition by owner order by object_name) as median_order,
            row_number() over (partition by owner order by dbms_random.value) as any_window_sort_criteria
        from dba_objects
    )
select table_key,x.any_window_sort_criteria,x.median_order,
    PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY y.median_order DESC) as rolling_median,
    listagg(to_char(y.median_order), ',' )WITHIN GROUP (ORDER BY y.median_order) as elements
from sample_data x
    join sample_data y using (table_key)
where y.any_window_sort_criteria between x.any_window_sort_criteria-3 and x.any_window_sort_criteria+3
group by table_key,x.any_window_sort_criteria,x.median_order
order by table_key, any_window_sort_criteria
/

ここに画像の説明を入力してください

于 2012-07-22T13:29:35.660 に答える