2013-07-19 1 views
2

SQL Server에서 일부 데이터를 처리하고 약간의 품질 보증을 수행하고 '응답'을 얻고 싶습니다.그룹화 된 비 등가 열/행을 검사하는 SQL Server

표는 테스트를 나타내며 테스트에서 100 % 일치를 제공하지 않으면 중복으로 실행되었습니다. 이 테이블은 다음 코드가 적용 가능하고 이들이 우선 순위의 오름차순으로되어있어서

: 1) -99 시험 2를 생략 하였다)이 00 시험 100 % 일치 3 아니었다) 뭐든지> 00 (100 % 일치 예 : 01, 02, 01-01 etc.)

이렇게해야 할 일이 두 가지 있습니다.

먼저 각 SampleID에 대해 01> 00> -99 을 선택해야합니다. 둘째, 테스트에 100 % 일치 (예 : # 3)가 있었는지 테스트에 동의하지 않아야합니다. 예를 들어 Run2 = 01과 Run3 = 02 인 11-0010-P1입니다 (아래).

나는 다음 코드로 처음 부분을 얻었지만, ROWNUMBER() 부분의 MAXIMUM을 얻을 수 없습니다. 질문.

정말 두 번째 부분에 붙어 있습니다.

모든 도움을 주시면 감사하겠습니다.

DECLARE @TempTable TABLE (SampleID varchar(10), TestRun int, TestResult varchar(max)) 

    INSERT INTO @TempTable VALUES('11-0003-P1', 1,'-99')  
    INSERT INTO @TempTable VALUES('11-0004-P1', 1, '00')  
    INSERT INTO @TempTable VALUES('11-0005-P1', 1, '01') 
    INSERT INTO @TempTable VALUES('11-0007-P1', 1,'-99')  
    INSERT INTO @TempTable VALUES('11-0007-P1', 2, '00')  
    INSERT INTO @TempTable VALUES('11-0007-P1', 3, '00')  
    INSERT INTO @TempTable VALUES('11-0008-P1', 1,'-99') 
    INSERT INTO @TempTable VALUES('11-0008-P1', 2, '02') 
    INSERT INTO @TempTable VALUES('11-0008-P1', 3, '02')  
    INSERT INTO @TempTable VALUES('11-0009-P1', 1, '00') 
    INSERT INTO @TempTable VALUES('11-0009-P1', 2, '07') 
    INSERT INTO @TempTable VALUES('11-0009-P1', 3, '07') 
    INSERT INTO @TempTable VALUES('11-0010-P1', 1, '00') 
    INSERT INTO @TempTable VALUES('11-0010-P1', 2, '01') 
    INSERT INTO @TempTable VALUES('11-0010-P1', 3, '02')  

    SELECT SampleID, TestRun, TestResult, 
    ROW_NUMBER() OVER (PARTITION BY SampleID 
         ORDER BY 
          CASE TestResult 
          WHEN '-99' THEN 1 
          WHEN '00' THEN 2 
          ELSE 3 
          END 
         ) AS RowNumber 
    FROM @TempTable 
    ORDER BY SampleID, TestRun 

결과는 다음과 같이해야합니다 :

SampleID TestResult 
11-0003-P1 -99 
11-0004-P1 00 
11-0005-P1 01 
11-0007-P1 00 
11-0008-P1 02 
11-0009-P1 07 
11-0010-P1 Err 01:02 

** 그것은 것 실제로 (11-0010-P1에 대한 예 1시 2분) 충돌하는 값을 줄 적합하지만 완전히 필요한 경우 오류 플래그는 정상입니다.

+0

+1. . . 그건 그렇고 좋은 질문입니다. 테스트 할 예제 데이터와 스크립트를 제공합니다! –

답변

1

이 일반 group by 사용 :

여기에 두 가지 중요한 포인트가 있습니다
select SampleId, 
     (case when max(TestResult) in ('-99', '00') then max(TestResult) 
      when max(TestResult) = min(case when TestResult not in ('-99', '00') then TestResult end) 
      then max(TestResult) 
      else 'Err '+min(case when TestResult not in ('-99', '00') then TestResult end)+':'+max(TestResult) 
     end) 
from TempTable 
group by SampleId; 

. 첫 번째는 '-99'< '00'< xx이며 숫자는 문자열뿐입니다. 따라서 max()은 마지막 테스트 결과를 찾습니다.

둘째 값은 둘 이상의 값이있는 "기타"값을 찾는 것입니다. 이를 위해 쿼리는 조건부 최소값을 사용합니다. 즉, '-99'와 '00'을 제외한 최소값을 찾습니다.

SQL 피들은 here입니다. 따라서 @TempTableTempTable으로 변경합니다.

+0

Thanks! 그것은 굉장했다 – user918967

0

다음 쿼리는 최대 행 번호를 줄 것이지만 '오류'에 대한 조건을 이해하지 못합니다.

검색어 : 당신이 해결할 수 있기 때문에 당신은 윈도우 기능에 의해 혼동

select SampleID, TestResult 
from (
SELECT SampleID, TestRun, TestResult, 
    ROW_NUMBER() OVER (PARTITION BY SampleID 
         ORDER BY 
          CASE TestResult 
          WHEN '-99' THEN 1 
          WHEN '00' THEN 2 
          ELSE 3 
          END desc 
         ) AS RowNumber 
    FROM @TempTable 
) t 
where RowNumber = 1 
ORDER BY SampleID, TestRun 
+0

Dang it - 오류가 발생했습니다 (오류 기능). 02:07 (비등가 행)을 읽어야합니다. – user918967

+0

아니요, 정확하지 않았습니다. 11-0010-P1을 보면 Run 2가 Run 3과 같지 않다는 것을 알 수 있습니다. – user918967