2016-10-06 35 views
0

我有一個SAS進程,我試圖在SQL中進行復制。 SAS中有一個事務數據集,我通過SSMS導入了SQLServer,這是一個起點。在SAS和SQL中處理重複

數據集中有611K個事務。

該過程非常簡單直接。刪除重複項並聚合數據。

但是,最終的輸出並沒有在兩個進程之間協調一致,而且我一直在這方面打我的腦袋。

我把它縮小到的一個特定區域可能是重複處理。

我做的我做它的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. 

我知道它很難建議無需數據集,但我只是想知道是否有任何SAS代碼段中我從SQL中缺少的差異。

+0

您是否缺少id或closedat的值? – jms

+0

感謝@jms的迴應。我檢查了這一點,但似乎沒有任何專門針對這些列的缺失值。 – Bee

+0

如果你在同一天有重複,我會很好奇。這是一個很難處理的情況, SAS有一個行順序的概念,即SQL沒有,所以SAS很樂意重複刪除,即使它不知道您決定的是訂單的基本原理,而SQL真的不喜歡。 – Joe

回答

0

您的排序只能通過ID,而不能通過次要日期標準。所以被刪除的記錄可能與你的SQL過程不一樣。如果它類似,你的SORT在BY語句中會有另一個變量(日期)。

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

如果您彙總的值在您的不同記錄中不一樣,那麼您將遇到問題。如前所述,在你的SQL中,如果你有多個日期和ID,那麼你將會在記錄數量上有所不同。 SAS每個ID總是隻有1個記錄,但SQL不保證這樣做。

+0

謝謝@Reeza所以,即使在SQL中,如果我通過ID對它們進行排序並僅保留第一條記錄,但我可能會得到計數,但不能保證兩者之間保留相同的事務/記錄是正確的嗎?不同的排序方式等。我可以做什麼來獲得確切結果的任何想法? – Bee

+0

你不能AFAIK。事實上,如果您在差異處理器上應用相同的算法(上述),它可能會以不同的方式處理它們。當我們將其從一個站點移動到另一個站點時,曾經在項目中遇到過這種情況,那裏是英特爾與AMD處理器。作爲一種邏輯在舊的過程中失敗並繼續前進的值得注意的事情。但也需要處理SQL中的多個問題。這是一個轉換代碼的事實 - 有時你會發現錯誤。 – Reeza

+0

你的排序應該由id和日期完成。然後,通過數據集,獲取第一個ID。 – jms