Oracle 12C添加用于趋势的行

时间:2017-03-02 00:42:24

标签: sql oracle automation oracle12c trending

假设我有历史数据,列出每天显示缺陷的项目。项目放入和退出此列表。 I.E.-

TABLE NAME: ITEMS_WITH_DEFECTS

DAY        | ITEMID
-------------------
01-JAN-16  | A
01-JAN-16  | D
02-JAN-16  | B
02-JAN-16  | D
03-JAN-16  | A
03-JAN-16  | C
04-JAN-17  | A
04-JAN-17  | D

我想建立一个数据源,显示相对于前一天的每一天,有多少项是新的,已经丢失,并且已经结转。它希望这样做而不会丢失我的历史数据源中的任何信息,所以我想要的输出是:

TABLE NAME: ITEM_DEFECT_TRENDS

DAY       | ITEMID | DEFECT | TREND
------------------------------------
01-JAN-16 | A      | y      | New
01-JAN-16 | B      | n      | (null)
01-JAN-16 | C      | n      | (null)
01-JAN-16 | D      | y      | New
02-JAN-16 | A      | n      | Dropped
02-JAN-16 | B      | y      | New
02-JAN-16 | C      | n      | (null)
02-JAN-16 | D      | y      | Carryover
03-JAN-16 | A      | y      | New
03-JAN-16 | B      | n      | Dropped
03-JAN-16 | C      | y      | New
03-JAN-16 | D      | n      | Dropped
04-JAN-16 | A      | y      | Carryover
04-JAN-16 | B      | n      | (null)
04-JAN-16 | C      | n      | Dropped
04-JAN-16 | D      | y      | New

我知道如何制作TREND列,但我不知道如何将行或DEFECT列添加到输出中。

这是我可以用SQL还是PL SQL做的事情?

我想像这样对数据建模的原因是因为我的数据库包含大约12,000个可能项目的大型列表,但是一次只有500个左右的项目会出现缺陷。只有我必须考虑的项目与所有可能的项目相比,它的内存效率更高。

1 个答案:

答案 0 :(得分:1)

是的,我认为你可以用SQL做到这一点:

select d.day, i.itemid, 
       (case when id.itemid is not null then 'y' else 'n' end) as defect,
       (case when id.itemid is null and
                  lag(id.itemid) over (partition by i.itemid order by d.day) is null
             then 'New'
             when id.itemid is not null and
                  lag(id.itemid) over (partition by i.itemid order by d.day) is not null
             then 'CarryOver'
             when lag(id.itemid) over (partition by i.itemid order by d.day) is not null
             then 'Dropped'
        end) as trend
from (select distinct day from items_with_defects) d cross join
     (select distinct itemid from items_with_defects) i left join
     items_with_defects id
     on id.day = d.day and id.itemid = i.itemid;

我们的想法是使用cross join生成所有行 - 如果您有其他方法可以获取所需的天数和项目,则使用它们。

然后left join原始数据检查匹配。 defect列很容易。我认为trend列逻辑是正确的,但问题并没有完全解释它。