добавление нового столбца путем нормализации существующих столбцов в таблице - PullRequest
0 голосов
/ 06 марта 2020

Я новичок в SQL и мне нужна помощь в добавлении столбца нормализованных оценок в таблицу.

Моя таблица division_score имеет следующую схему

id      division    sub_division    score
------------------------------------------
id1     account     current asset   0.97
id1     account     debt            0.96
id2     marketing   brand           0.4
id3     marketing   digital         0.3
id4     marketing   consumer        0.2
id4     marketing   TV              0.8
id5     revenue     customer1       1.09
id5     revenue     customer2       10.9
id5     revenue     customer3       5

Я хочу добавить новый столбец normalized_score к этой таблице, где

normalized_score = 0 if division = 'marketing' else
normalized_score is normalized within the group (id, division) by diving score with sum of the total score in the group 
for example - 
for group id5 and revenue -> entry for id5,revenue,customer1 = 1.09/(1.09+10.9+5)
for group id5 and revenue -> entry for id5,revenue,customer2 = 10.9/(1.09+10.9+5)

конечный вывод будет выглядеть как

id      division    sub_division    score   normalized_score
-----------------------------------------------------------
id1     account     current asset   0.97    0.503
id1     account     debt            0.96    0.497
id2     marketing   brand           0.4     0.000
id3     marketing   digital         0.3     0.000
id4     marketing   consumer        0.2     0.000
id4     marketing   TV              0.8     0.000
id5     revenue     customer1       1.09    0.064
id5     revenue     customer2       10.9    0.642
id5     revenue     customer3       5       0.294

Редактировать с версией PostgreSQL 10.11

Ответы [ 2 ]

1 голос
/ 06 марта 2020

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

У вас есть два требования:

  1. if / then / else это сопоставляет PostgreSQL CASE
  2. агрегированную операцию над группами строк, это сопоставляет 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';
0 голосов
/ 06 марта 2020

Вот запрос. Пожалуйста, попробуйте.

select id, division, sub_division, score, 
case when division = 'marketing' then 0 else score/normalized_score as normalized_score 
from (
    select id, division, sub_division, score, sum(score) over (partition by id, division) as normalized_score from table
    ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...