在mysql中,有什么方法可以用一系列数字来计算平均值吗?

ffscu2ro  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(379)

我想做如下工作:

SELECT AVG([1,2,3]);

这当然会返回2。我得到的最接近的结果是以下几点不太理想,但可以放在一行中:

drop table nums;
create temporary table nums (num int);
insert into nums(num) values(1),(2),(3);
select avg(num) from nums;

如果有一种方法,我会假设这也可能与其他函数,如variance()和其他。
编辑:这个想法是出于好奇,不是我需要解决的真正问题。

syqv5f0l

syqv5f0l1#

平均值只能有一个参数。你需要这样做 SELECT AVG(num) FROM nums 你也可以这样做 SELECT SUM(num) / COUNT(num) FROM nums 只需知道,因为您使用整数进行除法,所以它将不精确。

cygmwpex

cygmwpex2#

我还认为mysql可能不是正确的工具(因为您不想存储数字),但是您的问题的答案是:是的,如果您愿意,您可以使用mysql而不创建表。
我没有找到任何用于此的内置函数/结构,但我提出了以下解决方案。我的想法是创建一个自定义函数,它接受分隔字符串中的数字,然后拆分字符串并计算数字的平均值。下面是一个使用整数的实现。输入应该是 num,num,num 以此类推,它应该以一个数字结尾(参见末尾的示例)。

DROP FUNCTION IF EXISTS AVGS;
DELIMITER $$
CREATE FUNCTION AVGS(s LONGTEXT) RETURNS DOUBLE
DETERMINISTIC
BEGIN
    DECLARE sum BIGINT DEFAULT 0;
    DECLARE count BIGINT DEFAULT 0;
    DECLARE pos BIGINT DEFAULT 0;
    DECLARE lft TEXT DEFAULT '';

    -- can we split?
    SET pos = LOCATE(',', s);
    WHILE 0 < pos DO -- while we can split
        SET lft = LEFT(s, pos - 1); -- get the first number
        SET s = SUBSTR(s FROM pos + 1); -- store the rest
        SET sum = sum + CAST(lft AS SIGNED);
        SET count = count + 1;
        SET pos = LOCATE(',', s); -- split again
    END WHILE;

    -- handle last number
    SET sum = sum + CAST(s AS SIGNED);
    SET count = count + 1;

    RETURN sum / count;
END $$
DELIMITER ;

SELECT AVGS("1");     -- prints: 1    
SELECT AVGS("1,2");   -- prints: 1.5
SELECT AVGS("1,2,3"); -- prints: 2

在这里观看现场工作演示。
差异可能要复杂得多,但我希望你能理解。

2fjabf4q

2fjabf4q3#

你用错了工具来解决你的问题。
如果要计算列表的方差,可以使用某种脚本语言,比如php、python等。如果要先存储数据,然后才计算方差,当然可以使用mysql之类的语言。

相关问题