gpt4 book ai didi

sql - 如何从当前行和上一行中获取唯一项的总和,但忽略重复项 Oracle SQL

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:31 30 4
gpt4 key购买 nike

如何在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com