作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何在 Oracle SQL 中编写查询以从我必须的表获取我想要的表,如下所示:
我有什么:
Date Item Units
----------- -------- --------
05-NOV-2018 A 3
05-NOV-2018 E 4
09-NOV-2018 C 7
16-NOV-2018 B 9
16-NOV-2018 D 4
21-NOV-2018 A 5
29-NOV-2018 B 12
29-NOV-2018 C 10
29-NOV-2018 F 6
29-NOV-2018 A 8
我想要的:
Date Total_Units_Per_Day
----------- --------------------
05-NOV-2018 7
09-NOV-2018 14
16-NOV-2018 27
21-NOV-2018 29
29-NOV-2018 44
Total_Units_Per_Day 列的计算方式:
Date Item Units Total_Unique_Items_Accumulated_Per_Day Total_Units_Per_Day
----------- -------- -------- ------------------------------- --------------------
05-NOV-2018 A 3 A, E 7
05-NOV-2018 E 4 A, E 7
09-NOV-2018 C 7 A, E, C 14
16-NOV-2018 B 9 A, E, C, B, D 27
16-NOV-2018 D 4 A, E, C, B, D 27
21-NOV-2018 A 5 A, E, C, B, D 29
29-NOV-2018 B 12 A, E, C, B, D, F 44
29-NOV-2018 C 10 A, E, C, B, D, F 44
29-NOV-2018 F 6 A, E, C, B, D, F 44
29-NOV-2018 A 8 A, E, C, B, D, F 44
随着我们每一天的进展(从 2018 年 11 月 5 日到 29 日),将当天和前一天的每个项目的单位相加。 但是,如果当天已经存在,则不要考虑前一天的项目单位。
例如,2018 年 11 月 21 日,Total_Units_Per_Day = 29。这是通过对所有先前项目的单位求和来完成的但使用:
A=5 个单位(2018 年 11 月 21 日),而不是 A=3 个单位(2018 年 11 月 5 日)
这种类型的查询可能吗?任何帮助将不胜感激(:谢谢!
最佳答案
这很复杂。您似乎想要每个项目的最新值。
如果您的项目列表有限,那么您可以采用蛮力方法:
select dte,
(lag(case when item = 'A' then units end ignore nulls, 1, 0) over (order by dte) +
lag(case when item = 'B' then units end ignore nulls, 1, 0) over (order by dte) +
lag(case when item = 'C' then units end ignore nulls, 1, 0) over (order by dte) +
lag(case when item = 'D' then units end ignore nulls, 1, 0) over (order by dte) +
lag(case when item = 'E' then units end ignore nulls, 1, 0) over (order by dte) +
lag(case when item = 'F' then units end ignore nulls, 1, 0) over (order by dte)
) as total_units_per_day
from t;
Here是一个数据库<> fiddle 。
编辑:
这是一个更通用的方法:
select dte, sum(units) as total_units_per_day
from (select d.dte, t.item, t.units, row_number() over (partition by t.item, d.dte order by t.dte desc) as seqnum
from (select distinct dte from t) d join
t
on t.dte <= d.dte
) td
where seqnum = 1
group by dte
order by dte;
还有一个 db<>fiddle为此。
关于sql - 如何从当前行和上一行中获取唯一项的总和,但忽略重复项 Oracle SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54994516/
我是一名优秀的程序员,十分优秀!