1

私は似たようなことで数時間立ち往生し、1 つの Teradata クエリで 25 パーセンタイル、50 パーセンタイル、75 パーセンタイルを出力するためのコードを整理しました。さらに拡張して、「 5 つのポイントの要約」を作成できます。母集団の推定値に応じた静的値の最小値と最大値を変更します。

どこかで誰かがエレガントなアプローチを求めていました. 私の共有。

コードは次のとおりです。

SELECT MAX(PER_MIN) AS PER_MIN,
       MAX(PER_25) AS PER_25,
       MAX(PER_50)  AS PER_50,
       MAX(PER_75)  AS PER_75,
       MAX(PER_MAX) AS PER_MAX
FROM (SELECT CASE WHEN ROW_NUMBER() OVER(ORDER BY DURATION_MACRO_CURR ASC) = CAST(COUNT(*) OVER() * 0.01 AS INT) THEN DURATION_MACRO_CURR END AS PER_MIN,
             CASE WHEN ROW_NUMBER() OVER(ORDER BY DURATION_MACRO_CURR ASC) = CAST(COUNT(*) OVER() * 0.25 AS INT) THEN DURATION_MACRO_CURR END AS PER_25,
             CASE WHEN ROW_NUMBER() OVER(ORDER BY DURATION_MACRO_CURR ASC) = CAST(COUNT(*) OVER() * 0.50 AS INT) THEN DURATION_MACRO_CURR END AS PER_50
             CASE WHEN ROW_NUMBER() OVER(ORDER BY DURATION_MACRO_CURR ASC) = CAST(COUNT(*) OVER() * 0.75 AS INT) THEN DURATION_MACRO_CURR END AS PER_75
             CASE WHEN ROW_NUMBER() OVER(ORDER BY DURATION_MACRO_CURR ASC) = CAST(COUNT(*) OVER() * 0.99 AS INT) THEN DURATION_MACRO_CURR END AS PER_MAX
      FROM PROD_EXP_DL_CVM.PROD_CVM
      WHERE PW_END_DATE =  '2016-10-18'
    ) BASE

目的の出力は次のとおりです。

ここに画像の説明を入力

4

1 に答える 1

7

条件付き集計を使用してこれを行います。

select min(DURATION_MACRO_CURR) as min_val,
       min(case when seqnum / 0.25 >= cnt then DURATION_MACRO_CURR end) as 25_percentile,
       min(case when seqnum / 0.50 >= cnt then DURATION_MACRO_CURR end) as 50_percentile,
       min(case when seqnum / 0.75 >= cnt then DURATION_MACRO_CURR end) as 75_percentile,
       max(DURATION_MACRO_CURR) as max_val
from (select pc.*,
             row_number() over (order by DURATION_MACRO_CURR) as seqnum,
             count(*) over () as cnt
      from PROD_EXP_DL_CVM.PROD_CVM pc
      where pc.PW_END_DATE =  '2016-10-18'
     ) pc;
于 2017-01-17T18:11:59.007 に答える