2017-09-05 83 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