2016-10-06 2 views
0

SQL에서 복제하려고하는 SAS 프로세스가 있습니다. SAS에는 SQL Server를 SSMS를 통해 가져 왔으며 시작점 인 트랜잭션 데이터베이스가 있습니다.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. 

나는 데이터 집합을하지 않고 제안 할 하드를 알지만, 불일치를 설명하는 SQL에서 누락 된 부분이 있는지 SAS 스 니펫에 알고 싶을뿐입니다.

+0

id 또는 closedat 값이 누락 되었습니까? – jms

+0

@jms 응답에 감사드립니다. 그걸 확인했지만이 열에 대해 누락 된 값이없는 것 같습니다. – Bee

+0

같은 날짜에 중복 된 것이 있으면 궁금 할 것입니다. 이것은 대처하기 힘든 상황입니다. SAS는 SQL이 제공하지 않는 행 순서 개념을 가지고 있으므로 SQL은 사용자가 무엇을 결정하는지 알지 못하는 경우에도 정리가 매우 행복하기 때문에 주문에 대한 근거가되며 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 할 수 없습니다. 실제로 diff 프로세서가있는 diff 시스템에 동일한 알고리즘을 적용하면 서로 다르게 처리 할 수 ​​있습니다. 우리가 한 사이트에서 인텔 대 AMD 프로세서가있는 다른 사이트로 옮길 때이 프로젝트에 한 번 참여했습니다. 논리가 이전 프로세스에서 실패하고 계속 움직이는 것에 대해주의 깊고 가치있는 것을 빨아들입니다. 또한 SQL의 여러 문제를 처리해야합니다. 전환 코드의 사실입니다. 버그를 발견하는 경우도 있습니다. – Reeza

+0

귀하의 정렬 방식은 ID와 날짜로 이루어져야합니다. 그런 다음 데이터 세트를 사용하여 첫 번째 ID를 가져옵니다. – jms