如何基于与上下行相关的逻辑创建新列

时间:2019-09-18 18:24:15

标签: oracle oracle-sqldeveloper

我有一个与此类似的表:

|ID|      |Error|              |Subject|             |Note|
==============================================================
|1    |Start Date Required    |Flag Flip        |Flipped per cust|

|1    |Start Date Required    |Date             |Start Date and End Date N.A.

|1    |End Date Required      |Flag Flip        |Flipped per cust

|1    |End Date Required      |Date             |Start Date and End Date N.A.

|8    |Description Required   |Date             |Date

|4    |Sink Flag not set      |Factor           |Factor is N.A

|4    |Sink Flag not set      |Factor Update    |Factor is N.A.

|4    |Sink Flag not set      |Sink             |Not Sinkable

我正在尝试创建另一个名为“ STATUS”的列。 每个ID我可以有多个注释,有时它们与错误无关。 这就是为什么看到ID 1时只有2个错误,却有4列的原因,因为此ID上还附有“标志翻转”注释。 对于每个“错误”,它将重复ID上附加的每个注释。

我们只关心与错误相关的主题/注释。 如果ID相同,并且NOTE列中的ONE列与ERROR列有关,则其状态可能为'CLEAR'。 如果没有与错误相关的注释,则注释的状态必须为“正在查看”

由于这种逻辑我希望拥有的表

|ID|      |Error|              |Subject|             |Note|                    |STATUS|
=======================================================================================
|1    |Start Date Required    |Flag Flip        |Flipped per cust|              |Clear|

|1    |Start Date Required    |Date             |Start Date and End Date N.A.   |Clear|

|1    |End Date Required      |Flag Flip        |Flipped per cust               |Clear|

|1    |End Date Required      |Date             |Start Date and End Date N.A.   |Clear|

|8    |Description Required   |Date             |Date                           |Review|

|4    |Sink Flag not set      |Factor           |Factor is N.A                  |Clear|

|4    |Sink Flag not set      |Factor Update    |Factor is N.A.                 |Clear|

|4    |Sink Flag not set      |Sink             |Not Sinkable                   |Clear|

如果上方或下方的行具有相同的ID,并且ERROR列具有与之关联的NOTE,则清除。如果没有与错误有关的注释(按ID),则进行审阅。

例如,由于ID 1具有开始日期/结束日期错误,并且NOTE与NA的开始日期/结束日期有关,因此对于ID为1的所有4行,它的状态都为CLEAR

因为ID 8的错误为“需要描述”,但“注”与DATE有关,因此必须进行回顾,因为没有关于描述的注解。

由于ID 4出现接收器标志错误,并且一行包含SINK主题/注释,因此对于所有3行,其状态都可能为CLEAR

我不确定如何编写此逻辑。我分别为每一行提供逻辑,但是我不知道如何通过ID将它们关联起来,因此,如果具有相同ID的一行具有与错误相关的注释,那么可以清除具有该ID的所有行。 任何帮助,将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:0)

好的,所以我们设法到达了一个可以在查询中构建一些智能的地方,以便它知道如何处理一些错误..然后我们可以从那里构建

这是根据我们所知的首过查询:

[
    "oldVM1",
    "wCloud1"
]

这会将某些行清除为“ Clear”,但大多数需要复查。我们不介意这种想法,因为yu似乎在说,只要给定ID的任何一行都是“清除”,它们都可以被清除。在这种情况下,我将利用这样一个事实,即按字母顺序排列的“清除”在“审阅”之前,因此,如果我们按ID分组并询问MIN状态,如果任何内容为“清除”,则它们都将获得清除:

SELECT 
  ID, 
  CASE 
    WHEN error LIKE '%Date Required' AND Note LIKE '%'||REPLACE(error, ' Required', '%') THEN 'Clear' 
    WHEN error LIKE '%Sink%' and note LIKE '%sink%' THEN 'Clear'
    ELSE 'Review' 
  END as Status
FROM
  table

现在,要应用此基于id的确定,我们要做的就是使其成为子查询并将其联接回数据:

SELECT 
  ID, 
  MIN(CASE 
    WHEN error LIKE '%Date Required' AND Note LIKE '%'||REPLACE(error, ' Required', '%') THEN 'Clear' 
    WHEN error LIKE '%Sink%' and note LIKE '%sink%' THEN 'Clear'
    ELSE 'Review' 
  END) as Status
FROM
  table
GROUP BY 
  ID