Как суммировать сумму для каждого пользователя?

У меня есть такие данные:

 USER_ID   NUM   num_id
1   47641   800    1
2   47641   100    2
3   47641   250    3
4   70919   200    1
5   70919   200    2
6   70919   200    3
7   70919   200    4

...

Я понятия не имею, что попробовать, результат, который я хочу, таков:

 USER_ID   NUM   num_id 
1   47641   800    1
2   47641   100    2
3   47641   100    3
4   70919   200    1
5   70919   200    2
6   70919   200    3
7   70919   200    4
... 

поэтому, если для каждого пользователя сумма num <1000, то все num должны быть одинаковыми, но если сумма num для каждого пользователя> 1000, например, для 47641 пользователя у нас есть 800 100 и 250, поэтому мы должны суммировать 800 и 100 и от 250 нам нужно только 100, потому что 800+100+100=1000 поэтому для num_id=3 нам нужно только 100

Я не написал код...

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
82
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Кажется, вам нужны суммы для первых записей н, сумма которых равна 1000. Вам нужна совокупная сумма:

select t.*,
       (case when running_sum <= 1000 then num
             when running_sum - num < 1000 then 1000 - (running_sum - num)
             else 0
         end) as new_num
from (select t.*, sum(num) over (partition by user_id order by num_id) as running_sum
      from t
     ) t;
BEGIN TRANSACTION;

/* Create a table called TEST123*/
/* A working example in SQLLITE3*/
 CREATE TABLE TEST123
(USER_ID integer,
NUM integer,
num_id integer);

/* Create few records in this table*/
INSERT INTO TEST123 VALUES(47641,800,1);
INSERT INTO TEST123 VALUES(47641,100,2);
INSERT INTO TEST123 VALUES(47641,250,3);
INSERT INTO TEST123 VALUES(70919,200,1);
INSERT INTO TEST123 VALUES(70919,200,2);
INSERT INTO TEST123 VALUES(70919,200,3);
INSERT INTO TEST123 VALUES(70919,200,4);

/* Display all the records from the table */
SELECT * FROM TEST123;


/*
SELECT a.USER_ID,  a.NUM ,a.num_id , (SELECT SUM(b.NUM) FROM TEST123 AS b where b.num_id<=a.num_id and b.user_id = a.user_id)
FROM TEST123 AS a 
GROUP BY a.USER_ID,a.NUM,a.num_id ORDER BY  a.USER_ID,a.num_id;
*/

CREATE TEMPORARY TABLE TEMP_TABLE1 AS
SELECT a.USER_ID AS USER_ID,  a.NUM AS NUM ,a.num_id AS num_id, (SELECT SUM(b.NUM) FROM TEST123 AS b where b.num_id<=a.num_id and b.user_id = a.user_id) AS CUM_NUM
FROM TEST123 AS a 
GROUP BY a.USER_ID,a.NUM,a.num_id ORDER BY  a.USER_ID,a.num_id;

SELECT * FROM TEMP_TABLE1;


SELECT USER_ID, NUM, num_id, CASE WHEN CUM_NUM > 1000 THEN (1000 - (CUM_NUM-NUM))  ELSE CUM_NUM END FINAL_CUM_NUM
FROM
TEMP_TABLE1;
create table t1(
tuser number,
tnum number,
numid number
);

Вставленные записи:

TUSER   TNUM    NUMID
47641   800     1
47641   100     2
47641   300     3
70919   200     1
70919   200     2
70919   200     3
70919   400     4
23451   800     1
23451   100     2
23451   600     3

Запрос решения:

select Tuser,
case 
when sum(Tnum) over(partition by Tuser order by numid)<=1000 then Tnum
when sum(Tnum) over(partition by Tuser order by numid)>1000 then 1000-((sum(Tnum) over(partition by Tuser order by numid))-tnum)
end Tnum,numid
from t1;

Выход:

TUSER   TNUM    NUMID
23451   800     1
23451   100     2
23451   100     3
47641   800     1
47641   100     2
47641   100     3
70919   200     1
70919   200     2
70919   200     3
70919   400     4

Другие вопросы по теме

Похожие вопросы

Функция PostgreSQL с именами таблиц и столбцов в качестве параметров и будет возвращать минимум и максимум этого столбца (любого типа) в виде массива?
Oracle SQL — использование CASE WHEN для выбора правильного поля даты
Как получить набор результатов из динамического SQL-запроса на основе выбора в Pentaho-Kettle?
Как написать нединамический SQLQuery, чтобы он возвращал только те записи, которые соответствуют нескольким предложениям EXISTS?
Использование операторов case в качестве опорной точки — DB2 SQL
Удалить символ из динамической строки
Возникли проблемы с построением правильного синтаксиса запроса Linq в c#.net для соединения после соединения
Объединение двух столбцов таблицы и возврат их в виде одного столбца, разделенного символом
Получить количество строк для каждой объединенной таблицы для каждой строки в основной таблице
Как обновить таблицу в MS Access 2007