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

Oracle 如何基于与上/下行相关的逻辑创建新列,oracle,oracle-sqldeveloper,Oracle,Oracle Sqldeveloper,我有一张类似的桌子: |ID| |Error| |Subject| |Note| ============================================================== |1 |Start Date Required |Flag Flip |Flipped per cust| |1 |Start Date Required |Date

我有一张类似的桌子:

|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还附加了一个“flag flip”注释。 对于每个“错误”,它将重复附加到ID的每个注释

我们只关注与错误相关的主题/注释。 如果ID相同,并且其中一个注释列属于错误列,则其状态可能为“清除”。 如果没有与错误相关的注释,则其状态必须为“审阅”

根据此逻辑,我希望得到的表格

|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,并且错误列具有关联的注释,则清除。如果没有与错误相关的注释(每个id),则检查

例如,由于ID 1有一个开始日期/结束日期错误,并且注释涉及的开始日期/结束日期为N.a,因此ID为1的所有4行的状态都可以为“清除”

因为ID 8有一个“需要说明”的错误,但是注释与日期有关,所以必须对其进行审查,因为没有关于说明的注释

因为ID 4有一个Sink标志错误,并且有一行有Sink主题/注释,所以它的所有3行的状态都可以为CLEAR

我不知道如何写这个逻辑。我对每一行都有单独的逻辑,但我不知道如何让它们通过ID关联,这样,如果具有相同ID的一行具有与错误相关的注释,则可以清除具有该ID的所有行。
任何帮助都将不胜感激!谢谢。

好的,我们已经设法找到了一个地方,在那里我们可以在查询中构建一些智能,以便它知道如何处理一些错误。。我们可以从那里开始建设

根据我们所知,这里是一个首次通过查询:

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
这将使一些行被清除,但大多数行需要重新检查。我们不介意这个想法,因为yu似乎在说,只要给定ID的任何一行是“清晰的”,它们都可以是清晰的。在这种情况下,我将利用字母顺序“Clear”在“Review”之前这一事实,因此如果我们按ID分组并询问MIN状态,如果有任何内容是明确的,他们都会得到一个明确的:

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
现在,我们需要做的就是将每个id的确定应用于子查询并将其连接回数据:

SELECT * FROM
(
 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
) determine
INNER JOIN
table t
ON 
  t.ID = determine.ID

告诉你当前行之前的行是什么?您有一个id或日期字段?当注释是错误时不清除或清除错误。“如果没有与错误相关的注释”这是什么意思?所有示例数据都有一个填充的
注释
列,因此如何知道
注释
是否与
错误
相关?只是当
note!=主题
?还是更复杂的?不幸的是,在您解释逻辑之前,不太可能有人能提供帮助。“如果没有与错误相关的注释”意味着如果错误有一个注释,其中包含有关错误的信息,则可以清除该注释。因为开始日期错误有一个关于开始日期的注释,所以可以清除它。如果ID有错误,它必须有一个与该错误相关的注释。在本例中,ID 4有一个Sink标志错误,并有一个说明其不可sinkable的注释,即该注释与该错误相关,可以清除。另一个示例:由于ID 1有开始日期错误,其中一个注释必须包含开始日期的信息,否则无法清除。