Прежде всего, если вы хотите добавить «вычисляемый» столбец в таблицу, лучше всего создать представление, которое добавляет необходимые данные. Учитывая, что представление является просто запросом SQL, проблема теперь состоит в том, чтобы написать запрос, который извлекает нужные вам данные.
У вас есть два требования:
- if / then / else это сопоставляет PostgreSQL
CASE
- агрегированную операцию над группами строк, это сопоставляет PostgreSQL оконным функциям.
Запрос, который дает вам что Вы хотите, чтобы было:
SELECT id, division, sub_division, score,
CASE division WHEN 'marketing' THEN 0
ELSE score/sum(score) OVER (PARTITION BY id, division) AS normalized_score
FROM division_score
И представление:
CREATE VIEW division_score_with_normalized_score AS
SELECT id, division, sub_division, score,
CASE division WHEN 'marketing' THEN 0
ELSE score/(sum(score) OVER (PARTITION BY id, division)) AS normalized_score
FROM division_score
Тогда вы можете просто запросить из него:
SELECT * FROM division_score_with_normalized_score WHERE id = 'id5';