#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
;
Комментарии:
1. Спасибо — но есть ли способ сделать это так, чтобы он исправлял таблицу? Потому что я хочу позже выполнить другие запросы к новой таблице, выведенной в вашем ответе
2. Я не уверен, что вы имеете в виду. Вы можете использовать запрос как подзапрос.