2009-04-22 20 views
0

私は参加する必要のあるデータを2セット持っていますが、データの品質があまり良くないため追加の問題があります。SSISが一致しませんJoin

2つのデータセットは、通話(通話)と通信(通話について作成されたレコード)です。彼らはそれぞれcall_idとcomm_idというIDを持っています。通信レコードには、結合を実行するcall_idもあります。問題は、データ収集システムが正しく機能していないことと、特定の通話に一致できない多数の通信があることです。すべての通話が通信を生成するわけではありません。

毎日、分析を実行するために結合リストを作成する必要があります。

  • ちょうど呼び出し、
  • だけで途切れ、
  • リンクCOMMとコール: 問題は、リンクの一部の不足のために、私は3つの異なる行型を得ることです。

私がしたいことは、与えられた日付の "Just Comm"行のすべての行に対して、同じ日付の "Just Call"行を削除する必要があります。私はコールから値を必要としない、私はちょうど起こったコールを知る必要があります。私がこれを行うならば、すべての "just comms"が "just call"行を削除し、commを作成した呼び出しが知る必要があるので、正しい行数で終了します。

私の問題は、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

ここでの最初のステップは、すでに私が行ったことです。コミュニケーションとコールの完全な外部結合により、3種類の行がすべて含まれているデータセットが生成されます。 where句は、 "call and comm"の行を削除します。 ビューを使用する2番目のクエリは、私が望むことをしません。 私は次のコメントでさらに説明します... –

+0

私は比類のない通話と通話記録を取りたいと思います。 通話記録を開始し、同じ日の通話記録と一致するリストに移動します。 各通信レコードは1回のみ使用してください。 コールレコードが一致する日付の未使用の通信を見つけることができない場合、それはヌルのままでなければなりません... –

+0

コールレコード(不一致の通信レコードの数まで)を無作為にクロスアウトする場合 - それは残るべきですか?あなたにはどんな価値がありますか?カウント以上に興味がありますか?そうでない場合は、単に別のクエリでそれらを数えてみませんか? – Tomalak

0

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> 

これはあなたに、今日のすべての通信を与えるだろう、だけ正しくリンクされているこれらの呼び出しと対:

私にとって、これは典型的なLEFTのように聞こえるが、状況を登録しよう。今日の他のすべての呼び出しは結果セットに終わらないでしょう。


EDIT:別の答えにOPさんのコメントから

私は比類のない コールとCOMM記録のすべてを取りたいです。電話番号 のコールレコードから始め、 の電話番号 と一致するリストに移動します。各通信記録 は1回のみ使用してください。コール レコードが 一致する日付で、未使用のCOMMを見つけることができない場合、それは ヌルままにしてください...

私はこのアプローチの重要な問題を参照してください:「コール」のレコード

どの手術後に残すべきものは何ですか?TOP 17(17は今日の "通話/通信"ミスマッチカウント)ですか?何が残っている?最新の電話は?

結果セットに17のランダムなコールレコードを残すことは、どのような価値がありますか?彼らは利用可能な情報をまったく持っていません。彼らはあなたが出てきたものよりも優れていません。どこかでそれらを表示しようとしていますか:なぜですか?

私はLEFT JOINに行って、残りの数を単純に集計します。

+0

これは私の問題を解決しません。なぜなら、毎日のどこに何回の呼び出しがあるかを知る必要があるからです。このソリューションは、私には匹敵しない呼び出しのすべてを失うことになります。 –

+0

次に、必要なデータとカウントを正確に定義する必要があります。状況と望ましい出力を示す小さな例を提供することが最善です。 – Tomalak

関連する問題