Почему поиск среднего значения по определенным группам не работает с использованием этого кода SQL?

#sql #alter

#sql #изменить

Вопрос:

Предположим , у нас есть следующая таблица (вызываемая numbers ):

 Name A B C
Jon  1 3 0.33
Sue  4 4 1
Jon  5 5 1
 

Я хотел бы изменить таблицу таким образом, чтобы она включала новый столбец, D , который является средним значением столбца C , специфичным для каждого отдельного человека. Например, Jon появляется дважды, и поэтому среднее значение C для них равно 0.33 1 / 2 = 0.665 . Следовательно, я хочу 0.665 , чтобы ко мне добавились Jon . Тот же принцип применим и к другим именам в базе данных, так что результат будет примерно таким:

 Name A B C    D
Jon  1 3 0.33 0.665
Sue  4 4 1    1
Jon  5 5 1    0.665
 

Есть какие-нибудь идеи, как это сделать? Я пытался ALTER TABLE numbers ADD D DECIMAL(50, 2) GENERATED ALWAYS AS AVG(C) GROUP BY Name , но это не сработало.

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

AVG() это функция агрегирования, которая работает по строкам. Выражения для сгенерированных столбцов работают только в пределах одной строки, а не между строками.

Вы можете сделать это с помощью представления (или, возможно, с помощью определяемой пользователем функции, в зависимости от вашей базы данных).:

 create view v_numbers as
    select n.*,
           avg(c) over (partition by name) as d
    from n;
 

Ответ №2:

Решение — это оконные функции:

 SELECT
    name
    ,a
    ,b
    ,c
    ,avg(c) OVER (PARTITION BY name) AS d
FROM
    numbers
;
 

Скрипка DB

Комментарии:

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

2. Я не уверен, что вы имеете в виду. Вы можете использовать запрос как подзапрос.