MySql查找由另一列分组的列的中位数,而不是整个列的中位数
背景: 我试图进行一系列的市场交易,并确定每种商品类型的实际移动金额。这几乎是我第一次尝试MySql,因此查询很难看,但以下几点几乎可以工作:MySql查找由另一列分组的列的中位数,而不是整个列的中位数,mysql,median,economics,Mysql,Median,Economics,背景: 我试图进行一系列的市场交易,并确定每种商品类型的实际移动金额。这几乎是我第一次尝试MySql,因此查询很难看,但以下几点几乎可以工作: SELECT types.typename, averages.type, averages.price, movement.sold, ( averages.price * movement.sold ) AS value FROM (SELECT type, R
SELECT types.typename,
averages.type,
averages.price,
movement.sold,
( averages.price * movement.sold ) AS value
FROM (SELECT type,
Round(Avg(price)) AS price
FROM orders
GROUP BY type) AS averages
INNER JOIN (SELECT type,
( startingvolume - currentvolume ) AS sold
FROM (SELECT type,
Sum(volume) AS currentVolume,
Sum(volumeentered) startingVolume
FROM orders
GROUP BY type) AS movement
WHERE ( startingvolume - currentvolume ) > 10000
ORDER BY sold) AS movement
ON averages.type = movement.type
INNER JOIN invtypes AS types
ON types.typeid = averages.type
ORDER BY value DESC
LIMIT 10 ;
-
上述数据的问题在于,原始市场数据不可避免地被异常值破坏,如下所示:
select type, price from orders where type = 34 order by price desc limit 10;
-
核心问题:
99%的市场数据是干净的,但异常值破坏了平均值,MySql似乎没有中间值函数。我已经找到了几个例子来说明如何找到整列的中位数,但我需要每个项目的中位数
在运行主查询之前,我如何确定每项平均值而不是每项平均值,或者如何高效地清除这些异常值的数据
注:
我曾尝试通过std忽略结果,但商品的价格从170亿美元到100亿美元不等,而不管价格范围如何,偏差仍然相对较低 我不会触及原始查询,因为它非常复杂,但您可以做的一个选择是使用子查询删除任何统计异常值。例如,如果您希望从orders表中删除任何值与您可以使用的平均值相差两个标准差以上的异常值:
SELECT t1.type,
t1.price
FROM orders t1
INNER JOIN
(
SELECT type,
AVG(price) AS AVG,
STD(price) AS STD
FROM orders
GROUP BY type
) t2
ON t1.type = t2.type
WHERE t1.price < ABS(2*t2.STD - t2.AVG) -- any value more than 2 standard devations
-- away from the mean is discarded
此处演示:
我不会触及您的原始查询,因为它非常复杂,但您可以做的一个选择是使用子查询删除任何统计异常值。例如,如果您希望从orders表中删除任何值与您可以使用的平均值相差两个标准差以上的异常值:
SELECT t1.type,
t1.price
FROM orders t1
INNER JOIN
(
SELECT type,
AVG(price) AS AVG,
STD(price) AS STD
FROM orders
GROUP BY type
) t2
ON t1.type = t2.type
WHERE t1.price < ABS(2*t2.STD - t2.AVG) -- any value more than 2 standard devations
-- away from the mean is discarded
此处演示:
好主意,但正如在原始帖子中所提到的,价格偏差率在便宜和昂贵的商品之间极不一致,导致任何乘数都会使给定价格范围内的所有订单失效。我不理解你的逻辑。然后只需更改丢弃异常值的阈值。您的数据在任何方面都不是特别的。根据您提供的样本数据,异常值远远超出了第一个标准差。好主意,但正如在原始帖子中提到的,便宜和昂贵商品之间的偏差价格比极不一致,导致任何乘数都会使给定价格范围内的所有订单无效。我不遵循您的逻辑。然后只需更改丢弃异常值的阈值。您的数据在任何方面都不是特别的。根据您提供的样本数据,异常值远远超出第一个标准偏差。
SELECT t1.type,
t1.price
FROM orders t1
INNER JOIN
(
SELECT type,
AVG(price) AS AVG,
STD(price) AS STD
FROM orders
GROUP BY type
) t2
ON t1.type = t2.type
WHERE t1.price < ABS(2*t2.STD - t2.AVG) -- any value more than 2 standard devations
-- away from the mean is discarded