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有开始日期错误,其中一个注释必须包含开始日期的信息,否则无法清除。