2017-06-15 14 views
0

FIRST_CONTACT_CAL_DAYSの平均値をキャプチャしようとしていますが、値の上下10%のインジケータを作成して、それらを外れ値から除外することができます。私の平均計算。インジケータを上下に追加する10%

どのようにこのように、どのような考えを行って行くのか分からないのですか?

SELECT DISTINCT 
     TO_CHAR(A.FIRST_ASSGN_DT,'DAY') AS DAY_NUMBER, 
     A.FIRST_ASSGN_DT, 
     A.FIRST_CONTACT_DT, 
     TO_CHAR(A.FIRST_CONTACT_DT,'DAY') AS DAY_NUMBER2,     
     A.FIRST_CONTACT_DT AS FIRST_PHONE_CONTACT, 
     A.ID, 
     ABS(TO_DATE(A.FIRST_CONTACT_DT, 'DD/MM/YYYY') - TO_DATE(A.FIRST_ASSGN_DT, 'DD/MM/YYYY')) AS FIRST_CONTACT_CAL_DAYS, 

     FROM HIST A 
      LEFT JOIN CONTACTS D ON A.ID = D.ID 

     WHERE 1=1 

答えて

1

あなたはこのようなものを探しているかもしれません。あなたの状況に適応してください。

複数の「グループ」または「パーティション」があり、各パーティションのアウトライヤーをスローした後、各グループの平均を個別に計算する必要があるとします。 (以下のクエリを適用することで簡単に対応できる代替案は、グローバルレベルで異常値を除外し、グループごとに平均値をグループ化し、各グループの平均値を取ることです)。

どのグループでも、すべてが1つの大きなデータであり、より簡単です。GROUP BYとPARTITION BYは必要ありません。

次に、関数NTILEは、バケット番号(この例では1から10の間)を各行に割り当てます(最初のデシル、つまり最初の10%、次の10分の1)。最後のデシール)。私はサブクエリでこれを行います。その後、外側のクエリでは、グループ化する前の最初と最後のバケットを除外し、平均を計算します。

テストの目的で、私はWITH句にそれぞれ10,000個の乱数を持つ3つのグループを作成します。これはソリューションの一部ではないため、コードのその部分に時間を費やす必要はありません(問題を解決するSQLコード) - それは、その場でテストデータを作成するのはちょっと汚いトリックです。

with 
    inputs (grp, val) as (
     select  ceil(level/10000), dbms_random.value(0, 150) 
     from  dual 
     connect by level <= 30000 
    ) 
select grp, avg(val) as avg_val 
from  (
      select grp, val, ntile(10) over (partition by grp order by val) as bkt 
      from inputs 
     ) 
where bkt between 2 and 9 
group by grp 
; 

GRP     AVG_VAL 
--- ----------------------- 
    1 75.021614866547043734458 
    2 74.286117923344418598032 
    3 75.437412573353736953791 
関連する問題