sql - 如何按条件获取动态累积数据
问题描述
我想根据条件获取累积数据
示例数据集(更新):
CREATE TABLE stackoverflow (
DT date,
Part_number varchAr(10),
sales_volume int
)
insert into stackoverflow values('2018-03-01','HDD','190000');
insert into stackoverflow values('2018-03-03','HDD','20000');
insert into stackoverflow values('2018-03-03','HDD','70000');
insert into stackoverflow values('2018-03-03','SDD','100000');
insert into stackoverflow values('2018-03-03','SDD','20000');
insert into stackoverflow values('2018-03-05','HDD','90000');
insert into stackoverflow values('2018-03-05','SDD','50000');
insert into stackoverflow values('2018-03-05','SDD','50000');
insert into stackoverflow values('2018-03-06','SDD','20000');
insert into stackoverflow values('2018-03-07','HDD','50000');
insert into stackoverflow values('2018-03-07','HDD','40000');
insert into stackoverflow values('2018-03-07','SDD','100000');
insert into stackoverflow values('2018-03-07','SDD','40000');
insert into stackoverflow values('2018-03-08','HDD','20000');
insert into stackoverflow values('2018-03-08','HDD','30000');
insert into stackoverflow values('2018-03-08','SDD','60000');
insert into stackoverflow values('2018-04-08','SDD','80000');
insert into stackoverflow values('2018-04-09','HDD','10000');
insert into stackoverflow values('2018-05-11','HDD','20000');
select * from stackoverflow;
如果运行总和高于条件,则复位并以下列条件启动。
条件
- 如果系统小于等于200000,
只要大于100000,备注栏就会显示“OK”。 - 如果系统小于等于30000,
只要大于80000,备注栏就会显示“OK”。 - 如果保税系统小于等于400000,
只要大于60000就会在备注栏显示“OK”。 - 如果系统小于等于500000,
只要值大于40000,备注栏就会显示“OK”。 - 如果系统大于 500,000,
则每超过 30000 在备注栏中显示“OK”。
cum.sum <= 200000 || "OK" is displayed on DESC when it exceeds 100,000
cum.sum <= 300000 || "OK" is displayed on DESC when it exceeds 80,000
cum.sum <= 400000 || "OK" is displayed on DESC when it exceeds 60,000
cum.sum <= 500000 || "OK" is displayed on DESC when it exceeds 40,000
cum.sum > 500000 || "OK" is displayed on DESC when it exceeds 30,000
条件结果 - 描述。列只不过是对条件结果的提醒。
DT PARTS COUNT CUM.SUM DESC.
2018-03-01 HDD 190,000 190,000 OK
2018-03-03 HDD 20,000 210,000
2018-03-03 HDD 70,000 280,000
2018-03-03 SDD 100,000 100,000 OK
2018-03-03 SDD 20,000 120,000
2018-03-05 HDD 90,000 370,000 OK
2018-03-05 SDD 50,000 170,000
2018-03-05 SDD 50,000 220,000 OK
2018-03-06 SDD 20,000 240,000
2018-03-07 HDD 50,000 420,000
2018-03-07 HDD 40,000 460,000 OK
2018-03-07 SDD 100,000 340,000 OK
2018-03-07 SDD 40,000 380,000
2018-03-08 HDD 20,000 480,000
2018-03-08 HDD 30,000 510,000 OK
2018-03-08 SDD 60,000 440,000 OK
2018-04-08 SDD 80,000 520,000 OK
2018-04-09 HDD 10,000 520,000
2018-05-11 HDD 20,000 540,000 OK
期望的结果
DT PARTS COUNT CUM.SUM
2018-03-01 HDD 190,000 190,000
2018-03-03 SDD 100,000 100,000
2018-03-05 HDD 90,000 370,000
2018-03-05 SDD 50,000 220,000
2018-03-07 HDD 40,000 460,000
2018-03-07 SDD 100,000 340,000
2018-03-08 HDD 30,000 510,000
2018-03-08 SDD 60,000 440,000
2018-04-08 SDD 80,000 520,000
2018-05-11 HDD 20,000 540,000
==================================================== ===
更新了样本数据集和所需结果。
我会向所有有“OK”问题的人解释。
基于 PARTS 列的 HDD,
初始值为190000,超过100000,所以“ok”
该条件基于写为“ok”的最后日期的 cum.sum 数据。
解决方案
除了Desc
我不理解逻辑的列(显然您将使用一些基本case..when
表达式)之外,以下查询可以帮助您:
select dt as "DT", Part_number as "PARTS", sales_volume as "COUNT",
sum(sales_volume) over (partition by Part_number order by dt) as "CUM.SUM",
case when sales_volume >= 100000 then 'OK' end as "DESC."
from stackoverflow
order by dt, parts
推荐阅读
- php - 如何解码此 Json 文件并使用 PHP 访问 Country 值
- firefox - 如何告诉 Firefox 信任“xxx.localhost”作为安全来源?
- java - mac无法导入maven项目
- html - Angular 8/9:如何使用插值设置 data-parent 属性?
- python - 如何从训练和测试目标创建情节
- python - 如何从 .CSV 文件中查找前 10 行 AWND 并使用 Python 将结果存储在新的 .CSV 文件中?
- python - 如何在不渲染模板的情况下将python变量传递给flask中的html
- c - 如何使用 void 指针创建更通用的节点结构?
- flutter - Unicode 13 表情符号的正则表达式
- javascript - 为什么 setInterval 函数在 Microsoft Edge 中无法正常工作?