Как сложить сумму для каждого пользователя? - PullRequest
1 голос
/ 29 мая 2019

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

 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

Я не написал некоторый код ...

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

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Похоже, вам нужны суммы для первых n записей, сумма которых равна 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;
1 голос
/ 30 мая 2019
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
0 голосов
/ 29 мая 2019
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...