Oracle 12C 为趋势添加行
Oracle 12C Adding Rows for Trending
假设我有历史数据,其中列出了每天显示缺陷的项目。项目落入和落出此列表。即-
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 个左右的项目会出现缺陷。仅使用我必须考虑的项目而不是所有可能的项目来确定它的内存效率更高。
是的,我想你可以用 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
栏目逻辑是正确的,但是问题没有完全解释清楚。
假设我有历史数据,其中列出了每天显示缺陷的项目。项目落入和落出此列表。即-
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 个左右的项目会出现缺陷。仅使用我必须考虑的项目而不是所有可能的项目来确定它的内存效率更高。
是的,我想你可以用 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
栏目逻辑是正确的,但是问题没有完全解释清楚。