如何在 Oracle SQL 中编写查询以从所需的表中获取所需的表,如下所示:
我所拥有的:
var location = System.AppContext.BaseDirectory
我想要什么:
Path.Combine(location, "Swagger.json");
Total_Units_Per_Day列的计算方式:
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
随着每天的进展(从2018年11月5日至29日),将当天和前一天的每一项的单位相加。 但是,如果当前日期已经存在,则不要考虑前一天的单位。
例如,在2018年11月21日, Total_Units_Per_Day = 29 。这是通过对但使用的所有先前项目的单位求和来完成的:
从2018年11月21日起A = 5个单位,而不是从2018年11月5日起A = 3个单位
这种类型的查询可能吗?任何帮助将不胜感激(:谢谢!
答案 0 :(得分:1)
这很复杂。您似乎想要每个项目的最新值。
如果项目列表有限,则可以采用蛮力方法:
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是db <>小提琴。
编辑:
这是一种更通用的方法:
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。
答案 1 :(得分:0)
这将是解决您的问题的经典方法: 简单地将每天的单位求和,然后使用解析函数计算累积和。
index_dev.php
但这提供了预期的更高结果。
原因是在with tot as (
select trans_date, sum(units) total_unit
from tab
group by trans_date)
select trans_date,
sum(total_unit) over (order by trans_date) total_unit_cum
from tot
order by 1
;
TRANS_DATE TOTAL_UNIT_CUM
------------------- --------------
05.11.2018 00:00:00 7
09.11.2018 00:00:00 14
16.11.2018 00:00:00 27
21.11.2018 00:00:00 32
29.11.2018 00:00:00 68
中,您的item
已累积。
因此,第一步清理单位并计算实际增量值
通过从以前的记录中减去units
的值-默认为零-LAG
lag(units,1,0) ...
最终简单地将两个查询结合起来
select
trans_date, item, units units_orig,
units - lag(units,1,0) over (partition by item order by trans_date) units
from tab
order by 1,2;
TRANS_DATE I UNITS_ORIG UNITS
------------------- - ---------- ----------
05.11.2018 00:00:00 A 3 3
05.11.2018 00:00:00 E 4 4
09.11.2018 00:00:00 C 7 7
16.11.2018 00:00:00 B 9 9
16.11.2018 00:00:00 D 4 4
21.11.2018 00:00:00 A 5 2
29.11.2018 00:00:00 A 8 3
29.11.2018 00:00:00 B 12 3
29.11.2018 00:00:00 C 10 3
29.11.2018 00:00:00 F 6 6
这不是可能的简短查询,但易于理解...