如何确定邮政编码范围中是否存在重叠(DataStage 8.5)

时间:2014-06-17 19:22:24

标签: sql db2 datastage

目前,我有以下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中模拟交叉联接。

1 个答案:

答案 0 :(得分:0)

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

最初,作业将传入的顺序文件(阶段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