SQL查询以获取具有特定特征的特定序列号的最新测试记录

时间:2018-08-16 14:29:37

标签: sql greatest-n-per-group

我正在创建一个视图,其中包含来自众所周知的罐头测试和自定义测试的一系列测试结果。 GUI上的按钮可驱动固定测试,文本输入可提供自定义测试。标准%测试:2,5,10,50,75,100;自定义:0-100,作为输入的百分比。

SELECT        
    SerialNumber, ..., DateTimeStampStarted, 
    StartingSetpoint, EndingSetpoint... Status, Notes 
FROM 
    dbo.PIDTuneResults
WHERE        
    (DateTimeStampStarted IN (SELECT MAX(DateTimeStampStarted) AS Expr1 
                              FROM dbo.PIDTuneResults AS PIDTuneResults_1  
                              WHERE (StartingSetpoint = 0 
                                AND EndingSetpoint = 2)
                              GROUP BY SerialNumber))

此查询返回一个固定测试的(2%),我将这个查询重复6次(UNION),以枚举固定设定值2,5,10,50,75,100。每个查询返回1条记录...在该设备上执行的最后一次测试。现在,我需要自定义测试结果。这是我的尝试,但是任何自定义测试都需要最后一条记录。

SELECT  
    SerialNumber, ..., DateTimeStampStarted, 
    StartingSetpoint, EndingSetpoint... Status, Notes 
FROM 
    dbo.PIDTuneResults 
WHERE 
    StartingSetpoint = 0 
    AND EndingSetpoint NOT IN (2, 5, 10, 50, 75, 100)

如何获得具有任何结束设定值(1-100)的任何自定义测试的最后记录?有没有办法像其他人一样做汇总的qry?

谢谢,丹

1 个答案:

答案 0 :(得分:0)

我假设您正在使用sql server,因为您使用dbo.引用了一些表名。如果是这样,这是使用row_number的一种选择:

select *
from (select *, 
      row_number() over (partition by EndingSetpoint order by DateTimeStampStarted desc) rn
      from dbo.PIDTuneResults
      where StartingSetpoint=0) t
where rn = 1

这将根据每个EndingSetPoint的最高DateTimeStampStarted返回一行。如果您只需要限制1-100个,则只需添加where个条件。

select *
from (select *, 
      row_number() over (partition by EndingSetpoint order by DateTimeStampStarted desc) rn
      from dbo.PIDTuneResults
      where StartingSetpoint=0 and EndingSetpoint >= 1 and EndingSetpoint <= 100) t
where rn = 1