создайте и рассчитайте столбец z баллов в SQL (mariadb)

#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. Только что начал создавать и управлять своей собственной базой данных, поэтому приношу извинения за пробелы и благодарю за работу с ними, чтобы ответить на мой вопрос. Из того, что я вижу в документации, эта база данных не позволит выбрать подзапрос из той же таблицы.