目前,我有以下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中模拟交叉联接。
答案 0 :(得分:0)
以下是为解决此问题而开发的工作的概述。
最初,作业将传入的顺序文件(阶段0)转换为整数,根据类别(然后是邮政编码)排序(第2阶段),然后第二个变换器(第3阶段)将行ID转换为每条记录。
这让我有了以下工作数据集(DS):
KEY, AREA_NAME, AREA_CATEGORY, AREA_START_ZIP, AREA_END_ZIP
从这里开始,使用Clockwork-Muse的观察结果,我可以切换JOIN
(第4阶段)将工作数据集加入到自身,并使用A
和B
别名在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