在 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 分数列的主要内容,如果未能解决你的问题,请参考以下文章