Лучший способ вычислить несколько ячеек по значению идентификатора

#sql #postgresql

#sql #postgresql

Вопрос:

Предполагая, что у меня есть таблица пользователей, мои клиенты могут регистрировать itemid и цены. Моя структура базы данных выглядит так:

 userid  createddate itemid  itemprice
1       2021-18-01  gtsk    141
1       2021-17-01  hvb1    136
1       2021-17-01  gtsk    134
1       2021-15-01  hvb1    128
1       2021-10-01  hvb1    122
2       2021-18-01  gtsk    141
2       2021-17-01  hvb1    136
2       2021-17-01  gtsk    134
 

Я планирую создать простую круговую диаграмму с использованием приведенных выше данных. Но в этом случае есть дублированная метка, помеченная пользователем. (userid_1 имеет уже 2x помеченных gtsk данных). Это потому, что мой график диаграммы кажется сломанным из-за повторяющейся метки. Я хочу суммировать данные, помеченные сэмом, перед развертыванием данных.

В том-то и дело, что я в замешательстве, потому что я не могу вывести результаты печати как уникальный идентификатор элемента. Мой первый план состоял в том, чтобы создать новый столбец и суммировать ‘itemprice’, который имеет те же itemid и userid. Но где это должно быть написано? еще один столик? должен ли я создать новый столбец прямо в itemprice?

В этом сценарии ожидаемый результат должен быть таким:

 userid  createddate itemid  itemprice   totalprice
1         2021-18-01    gtsk    141     275   
1         2021-17-01    hvb1    136     386
1         2021-17-01    gtsk    134 
1         2021-15-01    hvb1    128 
1         2021-15-01    hvb1    122 
2         2021-18-01    gtsk    141    341
2         2021-17-01    hvb1    136    136
2         2021-17-01    gtsk    200 
 

275 = идентификатор пользователя 1.gtsk (2021-17-01) идентификатор пользователя 1.gtsk (2021-18-01)

Я могу вызывать и суммировать значения, как показано ниже.:

 select itemid, user_id, sum(itemprice)
from usertable
group by itemid, user_id
 

Моя проблема в том, что:

1- Если я использую этот запрос с оператором ОБНОВЛЕНИЯ, он будет обновлять каждую ячейку в этой строке. Мне просто нужно обновить только один с новым вычисляемым значением.

2- Есть ли какой-либо другой простой чистый способ вычисления itemprices?

Я искал в Google и в stackoverflow, но не смог найти ничего, что могло бы мне помочь. Заранее спасибо.

Ответ №1:

Вы можете легко рассчитать общую цену с помощью функции window. Нет необходимости хранить его где угодно.

 select userid, createddate, itemid, itemprice,
       sum(itemprice) over (partition by createddate, userid, itemid) as totalprice
from the_table;
 

Ответ №2:

Вам необходимо использовать row_number и sum аналитическую функцию следующим образом:

 select userid, createddate, itemid, itemprice,
       case when row_number() over (partition by userid, itemid order by createddate) = 1 
            then sum(itemprice) over (partition by userid, itemid) 
       end as totalprice
  from usertable;
 

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

1. Его довольно блестящий код. Что бы вы порекомендовали для хранения всех этих выходных данных?

2. Create table .. as select.. или в соответствии с вашими требованиями insert into .. select ..