2017-09-05 81 views
0

我需要構建一個查詢,可以計算平均值和計數值,同時忽略標準偏差中的異常值。MySQL忽略具有標準偏差的異常值

我在MySQL具有這些屬性兩個表(P和A):

P =付款:

Value_gbp 
Paymentid 
Account 
rfx_ref 

A =賬戶:

Accountid 
Entity_type 
Settlment_model 
rfx_ref 

到目前爲止,我已經得到了此:

SELECT 
Account, 
COUNT(value_GBP) AS '# Of Payments', 
TRUNCATE(AVG(value_GBP),2) As 'Avg Value' 
FROM payments, 

LEFT JOIN( 
SELECT STDDEV(value_gbp) as std_gbp 
FROM payments, accounts 
WHERE payments.paymentid = accounts.acountid 
AND Entity_type = 'company' 
AND settlement_model = 'payment agent' 
GROUP BY account 
) outlier 

On payments.paymentid = accounts.acountid 
WHERE payments.value_gbp<=outlier.std_gbp*2 
AND Entity_type = 'company' 
AND settlement_model = 'payment agent' 
GROUP BY account 

但它正在下降,指出:

On payments.paymentid = accounts.acountid 

任何人都可以幫助我嗎?

+2

「LEFT JOIN」前面不能有逗號 – Barmar

+0

主查詢無法訪問子查詢中的表。 – Barmar

+0

在furure中,最好向我們展示實際的錯誤消息,而不是猜測出現錯誤的位置 – RiggsFolly

回答

0

子查詢需要選擇accounts.accountid,然後您需要在JOIN條件中使用此項。

我也認爲你的異常定義是錯誤的。它不應該超過2個標準偏差,它應該是平均值超過2個標準差的東西。因此子查詢需要返回平均值和標準偏差,然後比較距離。

SELECT 
    account, 
    COUNT(value_GBP) AS '# Of Payments', 
    TRUNCATE(AVG(value_GBP),2) As 'Avg Value' 
FROM payments 
JOIN( 
    SELECT accountid, AVG(value_gpb) AS avg_gbp, STDDEV(value_gbp) as std_gbp 
    FROM payments, accounts 
    WHERE payments.paymentid = accounts.acountid 
    AND Entity_type = 'company' 
    AND settlement_model = 'payment agent' 
    GROUP BY accountid 
) outlier 
On payments.paymentid = outlier.accountid 
JOIN accounts ON payments.paymentid = accounts.accountid 
WHERE ABS(payments.value_gbp - outlier.avg_gpb) <= outlier.std_gbp*2 
AND Entity_type = 'company' 
AND settlement_model = 'payment agent' 
GROUP BY account 
+0

嗨, 此查詢不起作用.. 它落在最後一個WHERE子句 - SQL不會識別'entity_type'或'結算模型'。這有什麼解決辦法? –

+0

對,它需要再次加入'accounts'才能獲得。 – Barmar