0

次の表があります-かなり単純化されています

Table - Tests
Test
A
B
C
D
E
F
G
H

Table - TestHistory
Test    Result    Version
A       Pass      1
A       Fail      2
B       Pass      2
C       Fail      1
C       Pass      2
D       Fail      1
D       Fail      2
E       Fail      1

最後に実行したときに失敗したテスト (または任意のステータス) のリストを取得したいと考えています。しかし、それが見つかったバージョンでもあります。

したがって、上記の例では、これが返されるようにします。

A    Fail    2
D    Fail    2
E    Fail    1

私はいくつかの方法を試しました

select Test, LastResult = IsNull((Select Top 1 Result From TestHistory Where Test = Tests.Test order by Version desc), 'NOT_RUN')
from Tests

これにより、すべてのテストのリストが表示され、必要のない行 (つまり、Fail ではない行) を除外する必要があります。これは、それが実行されたバージョンも教えてくれません。

私もこれを試しました:

select Version, TH.Test, Result
from TestHistory as TH inner join Tests as T on TH.Test = T.Test
where Result = 'Fail'

しかし、次のような行が得られます。

Test    Result    Version
C       Fail      1

Last Resultではないため、それらは必要ありません。

これを制限して、後で多くのデータ操作 (またはさらに悪いことに、より多くの DB 読み取り) を行うことなく、必要なものを正確に提供するにはどうすればよいですか? どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

2

上記のソリューションに小さな修正を加えることができます。テスト順序で結果を受け取る必要がある場合、クエリは次のように変換できます。

SELECT src.Test, src.Result, src.Version
FROM
(
    SELECT th.Version, th.Test, th.Result, 
         ROW_NUMBER() over(partition by th.Test order by th.Version desc) as RowNum
    FROM dbo.TestHistory as th
) src
WHERE src.RowNum = 1 and src.Result = 'Fail'
order by src.Test;

このうち、クエリは必要な列の順序でセットを返します。

于 2013-10-27T08:36:04.940 に答える
1

どうですか:

select th.* from testHistory th 
where th.result = 'fail' -- this part, according to you, being optional
and th.version = 
    (select max(t.version) from testhistory t 
     where t.test = th.test);
于 2013-10-27T02:53:53.010 に答える