#sql #xampp #mariadb
Вопрос:
Как говорится в названии, ищем простой способ рассчитать оценку 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. Пожалуйста: 1) Опишите, как вы хотите рассчитать дополнительный столбец. 2) Должно ли оно быть рассчитанным и постоянным или, может быть, оно должно просто появиться на выходе? 3) Предоставьте примеры данных и желаемые выходные данные в текстовом формате. 4) Опишите, что означает «это не работает». 5) Добавьте тег вашей СУБД
2. Отметьте свой вопрос в базе данных, которую вы используете.
Ответ №1:
Для того чтобы рассчитать z-балл, вам нужны среднее значение и стандартное отклонение. Вы не указываете базу данных, которую используете, но один из методов, который должен работать (почти) во всех базах данных, — это подзапрос:
UPDATE tbl
SET z_score = (SELECT (tbl.values - avg(tbl2.values)) / stddev(tbl2.values)
FROM tbl tbl2
)
WHERE values IS NOT NULL;
Большинство баз данных также поддерживают какие JOIN
-либо операции в UPDATE
, но синтаксис зависит от базы данных.
Редактировать:
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;
Комментарии:
1. Очень признателен — обновил тег, как вы сказали. Я использую MariaDB. Только что начал создавать и управлять своей собственной базой данных, поэтому приношу извинения за пробелы и благодарю за работу с ними, чтобы ответить на мой вопрос. Из того, что я вижу в документации, эта база данных не позволит выбрать подзапрос из той же таблицы.