2017-08-21 7 views
0

私は同僚の仕事にいくつかのデータを提示する必要があり、MySQLでそれを分析する際に問題があります。MySQLは異常値を無視します

私は「payment」というテーブルを1つ持っています。

  1. クライアント(銀行など我々のクライアント)
  2. Amount_gbp(トランザクションの値のGBP相当)
  3. 通貨
  4. Origin_country
  5. Client_type(個人または:各支払いのための列があります会社)

私はかなり簡単なクエリを書いています:

SELECT 
    AVG(amount_GBP), 
    COUNT(client) AS '#Of Results' 
FROM payments 

WHERE client_type = 'individual' 
    AND amount_gbp IS NOT NULL 
    AND currency = 'TRY' 
    AND country_origin = 'GB' 
    AND date_time BETWEEN '2017/1/1' AND '2017/9/1' 

しかし、私が本当に必要とするのは、平均値からの異常値を排除することです。平均値からの標準偏差の数だけの結果が含まれます。例えば

、 などの結果の2%のトップ/ボトム10件の結果を無視AND/OR平均

から2 STDEVsの外にある任意の結果を無視して誰が助けることはできますか?

答えて

0

--- EDITED ANSWER - あなたの最高の最高は、平均してstd_dev値を持つ一時テーブルを作成し、それらと比較することである

---試してみて、私に知らせてください。それが不可能な場合は、私に教えてください:

CREATE TEMPORARY TABLE payment_stats AS 
SELECT 
    AVG(p.amount_gbp) as avg_gbp, 
    STDDEV(amount_gbp) as std_gbp, 
    (SELECT MIN(srt.amount_gbp) as max_gbp 
    FROM (SELECT amount_gbp 
    FROM payments 
    <... repeat where no p. ...> 
    ORDER BY amount_gbp DESC 
    LIMIT <top_numbers to ignore> 
    ) srt 
) max_g, 
    (SELECT MAX(srt.amount_gbp) as min_gbp 
    FROM (SELECT amount_gbp 
    FROM payments 
    <... repeat where no p. ...> 
    ORDER BY amount_gbp ASC 
    LIMIT <top_numbers to ignore> 
    ) srt 
) min_g 
FROM payments 
WHERE client_type = 'individual' 
    AND amount_gbp IS NOT NULL 
    AND currency = 'TRY' 
    AND country_origin = 'GB' 
    AND date_time BETWEEN '2017/1/1' AND '2017/9/1'; 

あなたはその後、一時テーブルに対して

SELECT 
AVG(p.amount_gbp) as avg_gbp, 
COUNT(p.client) AS '#Of Results' 
FROM payments p 
WHERE 
p.amount_gbp >= (SELECT (avg_gbp - std_gbp*2) 
       FROM payment_stats) 
AND p.amount_gbp <= (SELECT (avg_gbp + std_gbp*2) 
       FROM payment_stats) 
AND p.amount_gbp > (SELECT min_g FROM payment_stats) 
AND p.amount_gbp < (SELECT max_g FROM payment_stats) 
AND p.client_type = 'individual' 
AND p.amount_gbp IS NOT NULL 
AND p.currency = 'TRY' 
AND p.country_origin = 'GB' 
AND p.date_time BETWEEN '2017/1/1' AND '2017/9/1'; 

を比較することができます - その後、私はWHERE条件を繰り返さなければならなかった

DROP TEMPORARY TABLE payment_stats; 

通知に。また、*2を何でも<factor>に変更してください!

Still Phew!

それぞれが異なるSTATをチェックします

が、これは

+0

優れているなら、私に知らせて比較ねえ、これをありがとうございました!!! 私は2つの質問を持っています: 1.どこにpを入れますか? WHEREクエリの列選択の前に? 2. MySQLは、2番目のWHEREクエリが正しくないことを伝えています。構文は予期しないものです。どのように私はこれを解決するのですか? –

+0

LEFT JOINを使っているので次のコマンドとしてONになると思います...どうすればいいですか? –

+0

私はあなたの質問を理解している場合、(括弧内の)各副選択は、主として象徴的な照会であり、修飾子を必要としません。副選択は新しい表になり、後続の名前がこの表を識別します。私は後続の副選択に誤りがあることを知り、それを修正します –

関連する問題