Вставьте значение в новый столбец таблицы, рассчитанное на основе данных из той же таблицы

Я спрашиваю от имени жареного, который хотел бы сделать запрос, который вычисляет среднее время для победы в гонке при выборе 4 столбцов (КУРС, РАССТОЯНИЕ, ПУТЕШЕСТВИЕ и КЛАСС), группируя эти столбцы и упорядочивая эти столбцы. Затем рассчитанное среднее значение вставляется в ту же таблицу. Это возможно?

Он пытается использовать такого рода оператор SQL, который, очевидно, не является одним оператором, поскольку я не уверен, как его составить.

Спасибо за любую помощь!

INSERT 
INTO Table1 (AVGTIMECOLUMN) VALUES (AVERAGE)
SELECT Table1.COLUMN1, Table1.COLUMN2, Table1.COLUMN3, Table1.COLUMN4 Avg(Table1.TIME) AS AVERAGE, 
FROM Table1
GROUP BY Table1.COLUMN1, Table1.COLUMN2, Table1.COLUMN3, Table1.COLUMN4
ORDER BY Table1.COLUMN1, Table1.COLUMN2, Table1.COLUMN3, Table1.COLUMN4;

Или мне нужно сделать запрос UPDATE и установить AVG_WEIGHT только с расчетом?


person Craig Hickey    schedule 14.10.2011    source источник


Ответы (2)


Если бы вам действительно нужно было это сделать, то да, вы бы использовали оператор UPDATE (если я правильно понимаю ваш вопрос). Что еще более важно, в 99 случаях из 100 вам вообще не следует этого делать.

Одно из основных правил проектирования баз данных заключается в том, что вы не должны хранить избыточные данные. Помимо того, что он занимает дополнительное место, он также имеет проблемы с несогласованностью данных. Например, кто-то возвращается к таблице и обновляет один из столбцов, на котором основан производный столбец, но не обновляет производный столбец. Теперь это неправильно. В некоторых случаях вы сталкиваетесь с ситуацией, когда вы не знаете, какому набору данных верить.

Если MySQL поддерживает вычисляемые столбцы, вы можете определить один из них в таблице. В противном случае вам обычно следует вычислять это значение во время выполнения.

Иногда базу данных денормализуют для хранения избыточных данных из соображений производительности. К сожалению, в большинстве случаев разработчики делают это без предварительного подтверждения того, что на самом деле существует проблема с производительностью, которую нельзя исправить каким-либо другим способом. Большинство разработчиков, которые хотят использовать этот шаблон, уверены, что их — это особый случай, когда им следует игнорировать это правило проектирования. Но по моему опыту, в большинстве случаев они ошибаются.

person Tom H    schedule 14.10.2011
comment
Среднее значение рассчитывается из всех случаев выигрыша на определенном поле, а затем вставляется как значение, относящееся к определенному полю. Я только что узнал, спрашивая его дальше, что у него все хранится в одной таблице, и, очевидно, вы указали на избыточность ... поэтому я поручил ему сделать вторую таблицу, которую, как я предполагал, он уже сделал! так что я полагаю, что новый расчет будет заключаться в том, чтобы выбрать время выигрыша, когда идентификатор курса = 1, и вычислить среднее значение, а затем вставить его в таблицу информации о курсе ?! Спасибо за быстрый ответ и помощь! - person Craig Hickey; 14.10.2011
comment
Даже при таком подходе у вас все еще есть проблема избыточных данных, которые, вероятно, со временем станут несогласованными. - person Tom H; 14.10.2011

CREATE TABLE D_JOBS AS 

SELECT JOB_ID, JOB_TITLE, MAX_SALARY, MIN_SALARY,(MAX_SALARY-MIN_SALARY)AS DIFF_SALARY FROM CPY_JOBS

WHERE (MAX_SALARY-MIN_SALARY) >0

Изначально

Table name = CPY_JOBS; that containing (job_id, job_title, max_salary, min_salary)

Я хотел добавить новый столбец в качестве разницы_зарплаты, и он должен оставаться постоянным, поэтому я создал новую таблицу как D_JOBS и извлек все данные из CPY_JOBS с расчетом (max_salary-min_salary).


Я думаю, вы получите представление о запросе, спасибо.

person TUSHAR DHAMANKAR    schedule 24.07.2016