SSIS不匹配加入

时间:2009-04-22 10:36:28

标签: sql-server join ssis delete-row

我需要加入两组数据,但由于数据质量不佳,还有一个问题。

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

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

  • Just Calls,
  • Just Comms,
  • 链接的通讯和电话。

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

我的问题是如何在SSIS中执行此操作。我已经到了我的数据集,其中包含我需要的所有数据,并且是我上面提到的3种行类型的混合。您如何建议我完成删除“Just Call”行的过程?

2 个答案:

答案 0 :(得分: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的评论到另一个答案:

  

我想采取所有无与伦比的   电话和通讯记录。从...开始   通话记录并在列表中下载   将它们与任何通信记录匹配   从同一天开始。每个通讯记录   应该只使用一次。如果打电话   记录无法找到未使用的通讯   匹配日期然后它应该保留   空...

我发现这种方法存在一个关键问题:

在程序之后应该保留哪些“呼叫”记录? TOP 17(17是“call / comm” - 今天的失败计数)?什么都留下了?最新的电话?

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

我会选择LEFT JOIN并简单地收集其余部分。

答案 1 :(得分: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)

也许这不是你想要的,希望它有所帮助。