我想分析羣組數據的異常值a。可以說我有數據:羣組數據的異常值
+--------+---------+-------+
| fruit | country | price |
+--------+---------+-------+
| apple | UK | 1 |
| apple | USA | 3 |
| apple | LT | 2 |
| apple | LV | 5 |
| apple | EE | 4 |
| pear | SW | 6 |
| pear | NO | 2 |
| pear | FI | 3 |
| pear | PL | 7 |
+--------+---------+-------+
讓我們帶梨吧。如果我發現異常的方法是採取25%梨的最高價格和最低的25%,梨的異常會
+--------+---------+-------+
| pear | NO | 2 |
| pear | PL | 7 |
+--------+---------+-------+
至於蘋果:
+--------+---------+-------+
| apple | UK | 1 |
| apple | LV | 5 |
+--------+---------+-------+
那我想是創建一個視圖,這將顯示所有水果異常值工會的表格。如果我有這個觀點,我可以只分析尾巴,也可以與主表相交,以獲得沒有異常值的表 - 這是我的目標。解決這將是:
(SELECT * FROM fruits f WHERE f.fruit = 'pear' ORDER BY f.price ASC
LIMIT (SELECT ROUND(COUNT(*) * 0.25,0)
FROM fruits f2
WHERE f2.fruit = 'pear')
)
union all
(SELECT * FROM fruits f WHERE f.fruit = 'pear' ORDER BY f.price DESC
LIMIT (SELECT ROUND(COUNT(*) * 0.25,0)
FROM fruits f2
WHERE f2.fruit = 'pear')
)
union all
(SELECT * FROM fruits f WHERE f.fruit = 'apple' ORDER BY f.price ASC
LIMIT (SELECT ROUND(COUNT(*) * 0.25,0)
FROM fruits f2
WHERE f2.fruit = 'apple')
)
union all
(SELECT * FROM fruits f WHERE f.fruit = 'apple' ORDER BY f.price DESC
LIMIT (SELECT ROUND(COUNT(*) * 0.25,0)
FROM fruits f2
WHERE f2.fruit = 'apple')
)
這會給我的表我想要的,但是代碼LIMIT後似乎並不正確......另一個問題是組數。在這個例子中,只有兩組(梨,蘋果),但在我的實際數據中有大約100組。因此,'union all'應該以某種方式自動通過所有獨特的水果,而不必爲每個獨特的水果編寫代碼,查找每個獨特水果的異常值數量,僅取這些數量的行並將其顯示在另一個表格(視圖)中。
所以這是一個關於百分點的問題? – Strawberry
這是有點麻煩,不能使用'ROW_NUMBER()'(MySQL不支持) – wvdz
您似乎選擇最高和最低值,而不是頂部和底部25%的值!? ! – Strawberry