MySQL запрос: Как рассчитать среднее значение в строке? - PullRequest
8 голосов
/ 02 апреля 2009

Функция AVG () вычисляет среднее по столбцу, но как мне получить среднее значение для нескольких значений в одной строке следующим образом:

SELECT MEAN(A.a, A.b, ... , A.n) FROM A;

РЕДАКТИРОВАТЬ: конечно, как предлагает черувим, я могу сделать:

SELECT MEAN(A.a + A.b + ... + A.n) / n FROM A;

но я пытаюсь выяснить, есть ли более тонкий путь.

Ответы [ 5 ]

7 голосов
/ 02 апреля 2009
select (A.a + A.b) / 2 from A;
1 голос
/ 24 июня 2013

Я наткнулся на похожую ситуацию. Это стало полезным: http://tech -blog.borychowski.com / index.php / 2009/02 / mysql / среднее значение в строке /

Со страницы:

Когда мы делаем:

SELECT *, (V.rank_0 + V.rank_1 + V.rank_2) / 3
AS row_avg FROM voting V

мы получаем правильные средние значения только для строк, в которых все значения не равны NULL. Но когда у меня есть, например, 3, NULL, 4 Я хотел бы получить 3,5 в качестве возврата. Это тот момент, когда функция COALESCE () пригодится.

Что делает COALESCE ()? Из руководства MySQL мы имеем:

Возвращает первое ненулевое значение в списке или NULL, если нет ненулевых значений.

mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL

И эта информация поможет нам построить еще одно утверждение SELECT:

SELECT *,

#first part
(COALESCE(V.rank_0, 0)
+ COALESCE(V.rank_1, 0)
+ COALESCE(V.rank_2, 0))
/

#second part
(3 -
(COALESCE(V.rank_0 - V.rank_0, 1)
+ COALESCE(V.rank_1 - V.rank_1, 1)
+ COALESCE(V.rank_2 - V.rank_2, 1))
) AS row_avg FROM voting V
0 голосов
/ 02 апреля 2009

Я не знаком с синтаксисом MySQL, но как насчет выгрузки данных строки во временную таблицу в виде нескольких строк с одним столбцом, а затем использования функции AVG () для получения вашего результата?

0 голосов
/ 02 апреля 2009

Не красиво, но работает.

Не совсем MySql, но идея должна быть достаточно простой для перевода.

CREATE TABLE A (id int identity(1,1), C1 int, C2 int, C3 int)
GO

INSERT INTO A VALUES (1,1,1)
INSERT INTO A VALUES (2,2,2)
INSERT INTO A VALUES (3,3,3)
INSERT INTO A VALUES (1,2,3)
INSERT INTO A VALUES (4,5,6)
GO

CREATE VIEW A_Values
AS
SELECT ID, AVG(Val) AS Average 
FROM
(
    SELECT ID, C1 AS Val FROM A
    UNION ALL
    SELECT ID, C2 AS Val FROM A
    UNION ALL
    SELECT ID, C3 AS Val FROM A
) Q
GROUP BY ID
GO


SELECT * FROM A_Values
GO
0 голосов
/ 02 апреля 2009

Если никто не найдет лучшего решения, вы всегда можете просто сложить их вместе, а затем разделить на количество добавленных столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...