2009-04-22 43 views
0

我有两组数据需要加入,但由于数据质量并不好,所以存在一个额外的问题。SSIS不匹配加入

这两个数据集是呼叫(电话)和通信(关于电话呼叫创建的记录)。它们分别具有名为call_id和comm_id的ID。通信记录还具有用于执行加入的call_id。问题在于数据收集系统无法正常工作,并且我有大量的通信无法与特定的通话匹配。并非所有的通话都会产生通信。

对于每一天我需要创建一个联合列表来执行一些分析。 的问题是,由于缺少某些环节,我得到3种不同的行类型:

  • 只是调用,
  • 只是通讯科,
  • 链接通讯和呼叫。

我想要做的是每一行是给定日期的“Just Comm”行,我应该删除同一日期的“Just Call”行。我不需要任何来自通话的值,我只需要知道通话发生了。如果我这样做,我会得到正确的行数,因为所有的“只是通信”将删除一个“只是调用”行,就我所需要知道的是创建通信的调用。

我的问题是如何在SSIS中做到这一点。我已经到了拥有我的数据集的地步,其中包含我需要的所有数据,并且是我上面提到的3行类型的混合。您如何建议我通过删除“Just Call”行的过程?

回答

0

我不知道我完全了解你的问题,但也许你可以用FULL OUTER JOIN尝试:

SELECT 
    CL.ID AS CALL_ID, 
    CL.DATE AS CALL_DATE, 
    CM.ID AS COMM_ID, 
    CM.DATE AS COMM_DATE 
FROM 
    CALLS CL 
    FULL JOIN 
    COMMUNICATIONS CM ON 
    (CM.CALL_ID = CALL.ID) 
WHERE 
    (CL.ID IS NULL) OR 
    (CM.ID IS NULL) 

这将返回所有包含一个NULL呼叫ID或通信ID行(即具有“断开链接”的那些)。

然后,您可以使用它作为一个视图(姑且称之为VCALLS_COMMS),并加入它自己找到一个匹配的日期行:

SELECT 
    VCC1.CALL_ID, 
    VCC2.CALL_ID 
FROM 
    VCALLS_COMMS VCC1 
    JOIN 
    VCALL_COMMS VCC2 ON 
    (VCC2.COMM_DATE = VCC1.CALL_DATE) 

也许这不是正是你要找的内容, 希望能帮助到你。

0

不确定SSIS,但我可以给你一些SQL开始。

似乎你并不是过分关注这些调用,因为如果数据与通信不匹配,你愿意忽略这些数据。

对我来说,这听起来像一个典型的LEFT JOIN情况:

SELECT 
    call.call_id, 
    call.some_data, 
    comm.comm._id 
    comm.some_data, 
FROM 
    Communications comm 
    LEFT JOIN Calls call ON call.call_id = comm.call_id 
WHERE 
    <date filter: today> 

这会给你今天的所有通信,配对仅与正确链接这些调用。今天的所有其他调用都不会在结果集中结束。


编辑:

从OP的另一个答案评论:

我要采取一切的无与伦比的 电话和通讯记录。从 通话记录开始,然后从列表 开始,并将它们与同一天的任何通信记录 相匹配。每个通讯记录 只能使用一次。如果呼叫 记录不能与 找到一个未使用的通讯匹配的日期,那么它应该保持 空...

我看到一个关键问题这种方法:

其中的“呼”的记录程序之后应该保留哪些?排名前17位(其中17位是今天的“通话/通话”错误数)?无论剩下什么?最新的电话?

在结果集中留下17个随机呼叫记录可能有什么价值?他们没有任何可用的信息。它们并不比你划掉的那些更好。你打算在什么地方展示它们:为什么?

我会用左连接去,只是收集其余的计数。

+0

这不会解决我的问题,因为我需要知道每天在哪里有多少个电话。这个解决方案会让我失去所有无法比拟的通话。 – 2009-04-22 11:00:21

+0

然后,您需要准确定义您需要的数据和哪些数据。最好提供一个显示情况和所需输出的小例子。 – Tomalak 2009-04-22 12:42:12