Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql查找由另一列分组的列的中位数,而不是整个列的中位数_Mysql_Median_Economics - Fatal编程技术网

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

背景:

我试图进行一系列的市场交易,并确定每种商品类型的实际移动金额。这几乎是我第一次尝试MySql,因此查询很难看,但以下几点几乎可以工作:

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