Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:条件子查询?_Sql_Sql Server - Fatal编程技术网

SQL Server:条件子查询?

SQL Server:条件子查询?,sql,sql-server,Sql,Sql Server,我在一个表上设计一个查询,但是当我必须根据子查询的结果有条件地获取不同的信息时,我几乎被卡住了 所有这些都是关于一个名为UUTResults的表,我在其中存储系统上测试的每个UUT(测试单元)的信息。UUTresults表的相关字段为: UUTresultsId(主密钥) 序列号(被测装置序列号) 状态ID(测试结果)。它可以是1(通过)、2(失败)、3(错误)、4(中止) 有些受测试单元测试不止一次,每次重新测试可能会有不同的结果。示例: 10个不同的序列号 6个系列测试一次=UUTResul

我在一个表上设计一个查询,但是当我必须根据子查询的结果有条件地获取不同的信息时,我几乎被卡住了

所有这些都是关于一个名为UUTResults的表,我在其中存储系统上测试的每个UUT(测试单元)的信息。UUTresults表的相关字段为:

UUTresultsId(主密钥)
序列号(被测装置序列号)
状态ID(测试结果)。它可以是1(通过)、2(失败)、3(错误)、4(中止)

有些受测试单元测试不止一次,每次重新测试可能会有不同的结果。示例:
10个不同的序列号
6个系列测试一次=UUTResults表中的6个条目
4个不同的序列测试三次=UUTResults表中的12个条目
UUTResults表中总共有18个条目

下面是表中可能记录的简化示例:

UUTresultsId  SerialNumber  StatusId 
    1            1            1        
    2            1            2        
    3            2            1        
    4            1            3        
    5            2            1        
    ...         ...         ...
    18           10           2       
目标: 我需要根据以下规则获取SerialNumber和结果:

  • 仅考虑多次测试的序列号
  • 对于每个不同的序号,我只需要考虑最后一个测试(更高的主键)。
  • 如果上一次测试与某个条件不匹配(不是euql通过或失败),我需要在之前记录该序列号的结果
  • 这将是足够的,但只是要完全做到这一点,这将是伟大的继续在第2点。直到结果可接受(通过或失败)
  • 使用上表中的数据,SerialNuber 1已经测试了3次,但由于最后的结果是错误(3),我需要在测试之前获得该序列号的测试(PK UUTresultsId==2):结果是2(失败),很好,因此我可以继续下一个序列号

    我已经创建了一个查询,通过使用JOIN-to-JOIN查询和主键上的MAX()来覆盖第1点和第2点(参见附件图像),但我被第3点(和第4点)卡住了

    有人喜欢测验吗?我希望如此:)


    谢谢大家!

    如果需要对每个通过或失败的
    SerialNumber
    进行最后一次测试,可以使用筛选和窗口功能:

    select r.*
    from (select r.*,
                 row_number() over (partition by SerialNumber order by UUTresultsId desc) as seqnum
          from UUTresults r
          where statusid in (1, 2)
         ) r
    where seqnum = 1;
    

    注意:这假设
    UUTresultsId
    是一个单调递增的id,用于确定“最新”。您没有日期/时间,因此这似乎是一个合理的假设。

    不要发布代码的图像。代码是文本,将其发布为text。此外,除了“有人喜欢测验吗?”之外,你在这里问我们什么?对不起……下次我会做得更好。在目标中,我定义了我需要什么。根据规则,我需要多次测试UUT的序列号和测试状态:对于每个不同的序列号只考虑最后TEEST,如果结果与通过或失败不同,则需要考虑该序列号之前记录的结果。谢谢哇,非常感谢。现在我尝试一下…并研究它(老实说,我不知道“row_number()”和“Partition by”。是的,你是对的。PK每增加一个tiem我就添加一个新的DUT测试。时间和日期列也存在,但PK看起来更简单。非常感谢!@DavidePorro,请将其标记为答案,它有助于解决你的问题…无言。它看起来正在工作…我只需要进入这个查询并了解它是如何工作的。我真的感谢你ou Gordon…今天我学到了一些新东西(尽管我五十多岁了,但我不是SQL专家)。您好!