SSIS не соответствует - PullRequest
       14

SSIS не соответствует

0 голосов
/ 22 апреля 2009

У меня есть два набора данных, которые мне нужно объединить, но есть еще одна проблема, потому что качество данных не очень хорошее.

Два набора данных: Звонки (телефонные звонки) и Связь (записи, созданные о телефонных звонках). У них есть идентификаторы call_id и comm_id соответственно. Записи связи также имеют call_ids для выполнения соединения. Проблема в том, что система сбора данных не работала правильно с самого начала, и у меня большое количество сообщений, которые я не могу сопоставить с конкретным вызовом. Не все вызовы будут генерировать сообщение.

Для каждого дня мне нужно создать объединенный список, чтобы провести некоторый анализ. Проблема в том, что из-за отсутствия некоторых ссылок я получаю 3 разных типа строк:

  • Just Calls,
  • Just Comms,
  • Связанный комм и звонок.

Что я хочу сделать, так это то, что для каждой строки, которая является строкой «Just Comm» на данную дату, я должен удалить строку «Just Call» для той же даты. Мне не нужны значения из звонков, мне просто нужно знать, что звонок произошел. Если я сделаю это, я получу правильное количество строк, потому что все «just comms» удалят строку «just call», которая, насколько мне нужно знать, была вызовом, который создал comm.

Моя проблема в том, как сделать это в службах SSIS. Я дошел до того, что у меня есть мой набор данных, который содержит все необходимые мне данные и представляет собой смесь трех типов строк, которые я упомянул выше. Как бы вы посоветовали мне пройти процедуру удаления строк "Просто позвоните"?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2009

Я не уверен, что полностью понял вашу проблему, но, возможно, вы могли бы попробовать с 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, либо идентификатор связи (т. Е. Те, у которых есть «неработающая ссылка»).

Затем вы можете использовать это как представление (давайте назовем его 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 голосов
/ 22 апреля 2009

Не уверен насчет SSIS, но я могу дать вам немного SQL для начала.

Похоже, вы не слишком заинтересованы в вызовах, поскольку вы готовы игнорировать данные, если они не соответствуют сообщению.

Для меня это звучит как типичная ситуация ЛЕВОГО СОЕДИНЕНИЯ:

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>

Это даст вам все сегодняшние сообщения в паре только с теми вызовами, которые правильно связаны. Все другие вызовы сегодня не будут в результате в наборе результатов.


EDIT:

От комментария ОП к другому ответу:

Я хочу взять все непревзойденные записи вызовов и комм. Начните с Звоните записи и идти вниз по списку сопоставляя их с любой записью связи с того же дня. Каждая запись комм следует использовать только один раз. Если звонок запись не может найти неиспользуемое сообщение с соответствующая дата, тогда она должна остаться пустой ...

Я вижу ключевую проблему с этим подходом:

Какие из записей о вызовах должны остаться после процедуры? ТОП 17 (при этом 17 - это счет «call / comm» - несовпадение на сегодня)? Что осталось? Последние звонки?

Какое значение может иметь 17 записей случайных вызовов в наборе результатов? Они не несут полезной информации вообще. Они не лучше тех, которые вы вычеркнули. Вы собираетесь показывать их где-нибудь: почему?

Я бы пошел с LEFT JOIN и просто собрал бы счет остальных.

...