2016-10-06 14 views
0

私はSQLで複製しようとしているSASプロセスを持っています。私はSQL ServerをSSMS経由でインポートしたSASのトランザクションのデータセットがあります。これが出発点です。SASとSQLの重複の処理

データセットに611Kトランザクションがあります。

このプロセスは非常に簡単で簡単です。重複を削除し、データを集約します。

しかし、最終的な出力は両方のプロセス間で調整されず、私はこれに頭を打っています。

私がそれを絞り込んだ1つの特定の領域はおそらく重複の処理です。

私は最も古い日付でのみ取引を保持し、他のすべてのdupesを除去するためのSQLでそれをやっているん方法は次のとおりです。

  select x2.* 
     into #dupes 
     --delete x2 
     from #xl_Trans x2 
     inner join (
       select x1.id as id,min(x1.closedat) as min_closedat 
       from #xl_Trans x1 
       inner join 
        (
         select id,count(*) as CountOf 
         from #xl_Trans 
         group by id 
         having count(*) > 1 
        )x ON x1.id= x.id 
     group by x1.id 
     ) x3 ON x2.id = x3.id and x2.closedat <> x3.min_closedat 


     corresponding code in SAS is:delete duplicates, keep the first occurrence 

     proc sort data=temp1;by id;run; 
     data temp1; 
     set temp1; 
     by id; 
     if first.id; 
     run; 

SQL process removed 1700 dupes whereas SAS identified about 2200+ dupes. 

私はデータセットを持たずに提案し、そのハードを知っているが、I SASの抜粋の中に、私が矛盾を説明しているSQLにないことがあるかどうかを知りたいだけです。

+0

idまたはclosedatに値がありませんか? – jms

+0

応答のための@jmsに感謝します。私はそれを確認しましたが、特にこれらの列に欠損値がないようです。 – Bee

+0

同じ日に重複があると私は不思議に思います。これは非常に扱いにくい状況です。 SASはSQLにはない行順序の概念を持っているので、SQLは本当に好きではないが、あなたが注文の根拠となっていることがわからなくても、dedupするのは非常にうれしいです。 – Joe

答えて

0

あなたの並べ替えはIDのみで、二次日付基準ではありません。したがって、削除されるレコードは、SQLプロセスと同じではない可能性があります。それが似ていれば、あなたのSORTはBY文に別の変数(日付)を持ちます。

proc sort data=temp1; 
by id; -> NO DATE here; 
run; 

集計している値が異なるレコード間で同じでない場合は、問題が発生します。そして、前述のように、複数の日付とIDを持っていれば、レコード数に違いがあります。 SASはIDごとに常に1レコードしか取らないので、SQLはそれを保証するものではありません。

+0

@Reezaありがとう@Reeza SQLの場合でも、IDでソートして最初のレコードのみを保持すると、カウントを取得することができますが、同じトランザクション/レコードが両方の間に保持されるという保証はありません。並べ替えのさまざまな方法など私は正確な結果を得るために何ができるかについての考え? – Bee

+0

AFAIKできません。実際に、diffプロセッサを搭載したdiffマシンに同じアルゴリズム(上記)を適用すると、それらを別々に扱うことができます。インテルとAMDのプロセッサーを1つのサイトから別のサイトに移動したときに、これをプロジェクトに1回実行してください。論理が古いプロセスで失敗し、動いていることに気付く価値があります。しかし、SQLで複数の問題を処理する必要もあります。これはコードの移行の事実です。時にはバグを見つけることもあります。 – Reeza

+0

あなたの並べ替えはIDと日付で行います。次に、データセットを使用して、最初のIDをフェッチします。 – jms

関連する問題