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



我有一个类似的表格:

|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

我正在尝试创建另一名为"状态"的列。 我可以为每个ID有多个注释,有时它们与错误无关。 这就是为什么您看到对于 ID 1,只有 2 个错误,但有 4 列,因为此 ID 还附加了一个"标志翻转"注释。 对于每个"错误",它将重复附加到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,并且 ERROR 列具有与之关联的 NOTE,则清除。如果没有与错误相关的注释(每个 id(,则查看。

例如,由于 ID 1 具有开始日期/结束日期错误,并且注释与开始日期/结束日期为 N.A 有关,因此对于 ID 为 1 的所有 4 行,它的状态可以是 CLEAR

由于 ID 8 具有"需要描述"的错误,但注释与 DATE 有关,因此必须对其进行审查,因为没有关于描述的注释。

由于 ID 4 具有接收器标志错误,并且有一行带有接收器主题/注释,因此它的所有 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 的任何一行都是"清除"的,它们都可以清晰。在这种情况下,我将利用按字母顺序排列的"清除"在"审查"之前的事实,因此,如果我们按 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

最新更新