0

我有两组数据需要加入,但是由于数据质量不是很好,所以还有一个额外的问题。

这两个数据集是 Calls(电话呼叫)和 Communications(关于电话呼叫创建的记录)。它们的 ID 分别称为 call_id 和 comm_id。通信记录也有 call_ids 来执行连接。问题是数据收集系统一开始就无法正常工作,而且我有大量的通信无法匹配到特定的呼叫。并非所有呼叫都会产生通信。

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

  • 只是打电话,
  • 只是通讯,
  • 链接通讯和通话。

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

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

4

2 回答 2

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 是今天的“通话/通讯”不匹配计数)?剩下什么?最近的电话?

在结果集中留下 17 条随机通话记录可能有什么价值?它们不携带任何有用的信息。它们并不比你划掉的那些好。您是否要在某处展示它们:为什么?

我会使用 LEFT JOIN 并简单地收集其余部分的计数。

于 2009-04-22T10:51:39.587 回答
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)

可能不是你想要的,希望对你有帮助。

于 2009-04-22T11:26:11.407 回答