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

它的作用是给我一个所有测试的列表,然后我必须通过并踢出我不想要的行(即不是失败)。这也没有给我它运行的版本。

我也试过这个:

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

在没有大量数据操作(或更糟糕的是,更多的数据库读取)之后,我该如何限制它以准确地提供我需要的东西?任何帮助,将不胜感激。谢谢!

4

3 回答 3

2

我无法对其进行语法检查,但它应该很接近:

SELECT
  th.Test,
  th.Result,
  th.Version
FROM
  TestHistory th
  INNER JOIN
    (
      SELECT
      MAX(Version) as MaxVersion,
      Test
    FROM
      TestHistory
    GROUP BY
      Test
    ) sub ON sub.MaxVersion = th.Version AND sub.Test = th.Test
    WHERE 
      th.result = 'Fail'

说明:首先,在子查询中,您获得了测试的最大版本。然后使用连接来限制外部查询只返回与子查询的测试/版本匹配的结果。

编辑:忘记了 WHERE 子句——似乎你只想要最近结果失败的行。

根据您评论中的问题进行编辑:

这应该为您提供最近的失败,以及从未运行过的测试。请注意,这将过滤掉已经运行但从未失败的测试(您的数据没有任何这些)。为了时间,我基于我的原始查询,但我想有一种更优雅的方式:

SELECT
  t.Test,
  outerSub.Result,
  outerSub.Version  
FROM
  Test t
  LEFT JOIN 
(SELECT
  th.Test,
  th.Result,
  th.Version
FROM
  TestHistory th
  INNER JOIN
    (
      SELECT
      MAX(Version) as MaxVersion,
      Test
    FROM
      TestHistory
    GROUP BY
      Test
    ) sub ON sub.MaxVersion = th.Version AND sub.Test = th.Test
) outerSub on outerSub.Test = t.Test
    WHERE 
      outerSub.result = 'Fail' OR outerSub.Test IS NULL
于 2013-10-27T02:43:19.907 回答
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 回答