2

我想在 SQL SERVER 中处理一些数据,做一点 QA 并同时获得“答案”。

该表代表一个测试,如果测试没有给出 100% 匹配,则重复运行。

在此表中,以下代码适用,它们按优先级升序排列:1) -99 测试被跳过 2) 00 测试不是 100% 匹配 3) 任何 > 00 都是 100% 匹配(例如 01、02、01- 01等)

所以我需要做几件事。

首先,对于每个 SampleID,我需要选择 01 > 00 > -99 第二,我需要知道是否有任何测试有 100% 匹配(例如#3)并且测试不同意。一个例子是 11-0010-P1(下图),其中 Run2=01 和 Run3=02

我有点用以下代码获得了第一部分,但我无法获得查询的 ROWNUMBER() 部分的最大值。

我真的被困在第二部分了。

所有帮助将不胜感激!

    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 的 01:02),但不是完全必要的,Err 标志就可以了。

4

2 回答 2

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 Fiddle 在这里,这就是我更改@TempTableTempTable.

于 2013-07-20T00:51:35.003 回答
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
于 2013-07-19T22:47:53.550 回答