mysql 硬累计总数

icomxhvb  于 2023-01-16  发布在  Mysql
关注(0)|答案(1)|浏览(107)

因此,我有一个有2列的表-项目和数量。列[项目]是唯一的,[数量]可以有相同的值。任务:从第一个表中创建另一个包含附加列cumulative_total的表。此列将[数量]列的值[在10和160之间]相加,但当cumulative_total达到160时,必须last_value [cumulative_total]= 160,并且last_value [数量]= 160-last_value [数量]。并且该列是将列[数量]的值[在0和9之间]相加,但是当cumulative_total达到40时,您必须last_value [累计总数]= 40,并且last_value [数量]= 40-last_value [数量]。当满足此条件时,任务完成。

| 项目|数量|
| - ------|- ------|
| 第137/30号决议|十个|
| 第167/20号决议|十个|
| 167/30|三十|
| 二十三/三十|二十个|
| 第232/25号决议|三十三|
| 第236/20号决议|二十个|
| 第236/30号决议|三十|
| 第237/30号决议|三十|
| 第238/30号决议|二十个|
| 第241/20号决议|一百二十六|
| 第241/30号决议|三十|
| 第241/40号决议|八个|
| 二十五/三十|六个|
| 第251/30号决议|六个|
| 第254/30号决议|十个|
| 二十七○/三十|六个|
| 第三十三届会议|六个|
| 第342/40号决议|八个|
| 35/20|七|
| 36/20|八个|
| 三十八/二十|四个|
| 三十九/三十|四个|
| 第390/30号决议|四十|
| 小行星390/40|三十|
| 42/30|二十个|
| 四十四/三十|二十个|
| 四十五/三十|六个|
| 46/30|二十个|
| 第五十四届会议|二十三|
| 第五十九届会议|三十二|
| 六十八/三十|八个|
| 九十五/三十|九十四|
| 九七/三十|十个|
预期表:
| 项目|数量|累计总数|
| - ------|- ------|- ------|
| 第241/20号决议|一百二十六|一百二十六|
| 九十五/三十|三十四|一百六十|
| 第241/40号决议|八个|八个|
| 第342/40号决议|八个|十六|
| 36/20|八个|二十四|
| 六十八/三十|八个|三十二|
| 35/20|七|三十九|
| 二十五/三十|1个|四十|
如果需要,您可以下载. csv文件-link
我停在这一刻-
| 项目|数量|累计总数|
| - ------|- ------|- ------|
| 第241/20号决议|一百二十六|一百二十六|
| 九十五/三十|三十四|一百六十|
| 第241/40号决议|八个|八个|
| 第342/40号决议|八个|十六|
| 36/20|八个|二十四|
| 六十八/三十|八个|三十二|
| 35/20|七|三十九|
代码:

Drop table if exists SecondTable;
CREATE temporary table SecondTable(
                                      Item varchar(64),
                                      quantity int,
                                      cumulative_total int not null
);
INSERT INTO `SecondTable`
 select *
 from (
          select
              item,
              quantity - greatest(0, sum(quantity) over (ORDER BY quantity DESC) - 160) as quantity,
              least(sum(quantity) over (ROWS between unbounded preceding and current row),160) as cumulative_total
          from prak
          WHERE quantity BETWEEN 10 AND 159
      ) cumulative
 where quantity > 0;
INSERT INTO `SecondTable`
SELECT *
FROM(
        SELECT *,
               SUM(quantity) OVER (ORDER BY quantity DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_total
        FROM prak
        WHERE quantity < 10 ) as maxs
WHERE cumulative_total < 40 OR cumulative_total = 40;

Select @maxt := max(cumulative_total) from SecondTable;
Select *
from
    SecondTable
rxztt3cl

rxztt3cl1#

Set @count := 0;
Drop table if exists SecondTable;
CREATE temporary table SecondTable(
                                      id tinyint,
                                      Item varchar(8),
                                      quantity tinyint unsigned,
                                      cumulative_total smallint not null );
Drop table if exists ThirdTable;
CREATE temporary table ThirdTable(
                                      id tinyint,
                                      Item varchar(8),
                                      quantity tinyint unsigned,
                                      cumulative_total tinyint unsigned not null );
INSERT INTO `SecondTable`
Select @count:= @count + 1 as id, item, quantity,
       SUM(quantity) OVER (PARTITION BY quantity < 10 Order by quantity DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_total
from prak;
select * from SecondTable;
INSERT INTO `ThirdTable`
Select *
From SecondTable
Where quantity between 10 and 159 AND cumulative_total <= 160;
INSERT INTO `ThirdTable`
SELECT *
From SecondTable
WHERE id = @max160 + 1;
Update `ThirdTable`
Set quantity = 160 - @max, cumulative_total = 160
WHERE cumulative_total > 160;;
INSERT INTO `ThirdTable`
Select *
From SecondTable
Where quantity between 0 and 9 AND cumulative_total <= 40;
INSERT INTO `ThirdTable`
SELECT *
From SecondTable
WHERE id = @max40 + 1;
Update `ThirdTable`
Set quantity = 40 - @max2, cumulative_total = 40
where id = @max40 +1;
Select @max := max(cumulative_total) from ThirdTable where cumulative_total <160;
Select @max160 := id from ThirdTable where cumulative_total = @max;
Select @max2 := max(cumulative_total) from ThirdTable where cumulative_total <40;
Select @max40 := id from ThirdTable where cumulative_total = @max2;
Select * from ThirdTable;

谢谢大家

相关问题