6

データの列があり、その一部は NULL 値であり、そこから単一の 90 パーセンタイル値を抽出したいと考えています。

ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000

上記の場合、90 パーセンタイルを検索するときに値 900、80 パーセンタイルを検索するときに 800 などを返す手法を探しています。類似の関数は、上記のデータに対して 550 を返す AVG(ColA)、または MIN( ColA) は 100 などを返します。

助言がありますか?

4

3 に答える 3

12

NULL を除いて正確に 90 パーセンタイル値を取得したい場合は、直接計算することをお勧めします。次のバージョンでは、行番号と行数を計算し、適切な値を選択します。

select max(case when rownum*1.0/numrows <= 0.9 then colA end) as percentile_90th
from (select colA,
             row_number() over (order by colA) as rownum,
             count(*) over (partition by NULL) as numrows
      from t
      where colA is not null
     ) t

条件を WHERE 句ではなく SELECT 句に入れているので、50 パーセンタイル、17 パーセンタイル、または任意の値を簡単に取得できます。

于 2012-08-10T17:31:05.213 に答える
6
WITH
  percentiles AS
(
  SELECT
    NTILE(100) OVER (ORDER BY ColA) AS percentile,
    *
  FROM
    data
)
SELECT
  *
FROM
  percentiles
WHERE
  percentile = 90


注: データの観測値が 100 未満の場合、すべてのパーセンタイルに値があるわけではありません。同様に、100 を超える観測値がある場合、一部のパーセンタイルにはより多くの値が含まれます。

于 2012-08-10T17:12:14.027 に答える