如何从当前行和上一行获得唯一项的总和,而忽略重复项Oracle SQL

时间:2019-03-05 02:21:53

标签: sql database oracle

如何在 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个单位

这种类型的查询可能吗?任何帮助将不胜感激(:谢谢!

2 个答案:

答案 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

这不是可能的简短查询,但易于理解...