#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 ..