在 SQL (mariadb) 中创建和计算 z 分数列

Posted

技术标签:

【中文标题】在 SQL (mariadb) 中创建和计算 z 分数列【英文标题】:create and calculate z score column in SQL (mariadb) 【发布时间】:2021-11-17 06:53:10 【问题描述】:

正如标题所说,正在寻找一种简单的方法来计算一列中每一行的 z 分数。

我尝试了以下,不知道为什么它不起作用(返回错误ER_INVALID_GROUP_FUNC_USE)

ALTER TABLE tbl
ADD z_score INT;

UPDATE tbl
SET z_score = (values - avg(values))/ stddev(values)
WHERE values IS NOT NULL;

我在网上看到过一些方法,但感觉比必要的复杂。

【问题讨论】:

请:1)描述你想如何计算附加列。 2)它应该被计算和持久化,还是应该只出现在输出中? 3) 以文本格式提供样本数据和所需的输出。 4) 描述“它不起作用”是什么意思。 5) 添加你的 DBMS 的标签 用您正在使用的数据库标记您的问题。 【参考方案1】:

为了计算 z 分数,您需要平均值和标准差。您没有指定您正在使用的数据库,但应该适用于(几乎)所有数据库的一种方法是子查询:

UPDATE tbl
    SET z_score = (SELECT (tbl.values - avg(tbl2.values)) / stddev(tbl2.values)
                   FROM tbl tbl2
                  )
WHERE values IS NOT NULL;

大多数数据库还支持UPDATE 中的某种JOIN 操作,但语法取决于数据库。

编辑:

MariaDB 不支持上述标准 SQL 语法。相反,您可以使用CROSS JOIN:

UPDATE tbl CROSS JOIN
       (SELECT AVG(values) as avg_values, STDDEV(values) as stddev_values
        FROM tbl
       ) t2
    SET tbl2.z_score = (tbl.values - avg_values) / NULLIF(stddev_values, 0)
WHERE values IS NOT NULL AND stddev_values <> 0;

【讨论】:

非常感谢 - 如您所说更新了标签。我正在使用 MariaDB。刚刚开始创建和管理我自己的数据库,因此对存在的差距表示歉意,并感谢您与他们一起回答我的问题。从我在文档中可以看到,这个数据库不允许从同一个表中选择子查询。

以上是关于在 SQL (mariadb) 中创建和计算 z 分数列的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 在现有表中创建和填充主键列

在 Oracle SQL 中创建和填充 Varray

在 SQL 中创建和更改表值函数时对象类型不兼容

Oracle Sql Developer如何在Oracle中创建和设置角色?

序列号,在 SQL Server 中创建和修改

在 SQL Server 中创建和管理全局 Procs 和 UDF 的最佳方法是啥?