0

目前,我有以下 SQL 来标识地理区域中发生冲突(重叠)的记录。我在下面提供了一个 CTE 来说明表格内容。

   WITH
    A AS
    (
         SELECT
            AREA_ID,
                        AREA_CATEGORY,
            AREA_NAME,
            START_ZIP,
            END_ZIP
           FROM
            AREA_DEFINITION
    )
    ,
    B AS
    (
         SELECT
            AREA_ID,
                        AREA_CATEGORY,
            AREA_NAME,
            START_ZIP,
            END_ZIP
           FROM
            AREA_DEFINITION
    ) 
 SELECT
    A.AREA_ID,
    A.AREA_NAME,
        A.AREA_CATEGORY,
    A.START_ZIP      AS A_START_ZIP,
    A.END_ZIP        AS A_END_ZIP,
    B.START_ZIP      AS A_START_ZIP,
    B.END_ZIP        AS A_END_ZIP
   FROM
    A
CROSS JOIN
    B
  WHERE
    A.AREA_ID != B.AREA_ID
    AND A.AREA_NAME = B.AREA_NAME
    AND A.AREA_CATEGORY = B.AREA_CATEGORY
    AND((
            INT(A.START_ZIP) BETWEEN INT(B.START_ZIP) AND
            INT(B.END_ZIP))
        OR(
            INT(B.START_ZIP) BETWEEN INT(A.START_ZIP) AND
            INT(A.END_ZIP)))

在输入顺序文件 (CSV) 文件中提供地理区域时,我会得到一个如下所示的文件:

AREA_NAME, AREA_CATEGORY, AREA_START_ZIP, AREA_END_ZIP
Domestic, Sales, 00000, 99999
South, Wholesale, 75000, 85000
East, HQ, 00200, 00210 

当存在重叠并且不确定如何在 DataStage 中模拟交叉连接时,我想拒绝或失败该工作。

4

1 回答 1

0

以下是为解决此问题而开发的工作的概述。

最初,作业将(阶段 1)传入的顺序文件(阶段 0)邮政编码转换为整数,根据类别然后邮政编码进行排序(阶段 2),然后是第二个转换器(阶段 3)为每条记录添加行 ID。

这让我有一个工作数据集(DS)如下:

KEY, AREA_NAME, AREA_CATEGORY, AREA_START_ZIP, AREA_END_ZIP

从这里开始,使用来自 Clockwork-Muse 的观察,我可以切换到JOIN(第 4 阶段)以将工作数据集加入到自身中,并使用AB别名KEY

将数据集 (DS) 转换为以下内容:

KEY, AREA_NAME, A_AREA_CATEGORY, A_AREA_START_ZIP, A_AREA_END_ZIP, B_AREA_CATEGORY, B_AREA_START_ZIP, B_AREA_END_ZIP

从这里开始,最后的处理阶段是一个额外的转换器,它将根据以下条件为重叠添加一个指标:

If ((DS.A_AREA_START_ZIP <= DS.B_AREA_END_ZIP) AND (DS.B_AREA_START_ZIP <= DS.A_AREA_END_ZIP) AND DS.A_AREA_CATEGORY = DS.B_AREA_CATEGORY) Then 'Y' Else 'N'

留给我们一个数据集 (DS),其中包含以下信息以供进一步处理:

KEY, AREA_NAME, A_AREA_CATEGORY, A_AREA_START_ZIP, A_AREA_END_ZIP, B_AREA_CATEGORY, B_AREA_START_ZIP, B_AREA_END_ZIP, OVERLAP
于 2014-06-19T12:31:45.563 回答