我有一个表格,其中包含每个设备的几个测试的测量信息:
- Device_id提供了有关哪个设备进行了测试的信息
- MEASURATION_NO是一个递增数字,给出了执行测试的顺序
- 测试为您提供执行的测试的名称
- IS_LAST_MEASURATION_ON_TEST是一个布尔型字段,提供特定行是否为测试的最后测量结果的信息.如果该行是特定测试的设备的最后一行,则返回TRUE.如果同一设备的后续行用于相同的测试,则返回FALSE.
- OK提供测试正常(=真)或不正常(=假)的信息
- 如果ok=FALSE,则ERROR_CODE会给出特定的错误代码;如果OK=TRUE,则会给出0
WITH measurements (device_id,measurement_no,test,is_last_measurement_on_test,ok,error_code) AS ( VALUES
-- case 1: all measurements good, expecting to show test 3 only
('d1',1,'test1',true,true,0),
('d1',2,'test2',true,true,0),
('d1',3,'test3',true,true,0),
-- case 2: test 2, expecting to show test 2 only
('d2',1,'test1',true,true,0),
('d2',2,'test2',true,false,100),
('d2',3,'test3',true,true,0),
-- case 3: test 2 und 3 bad, expecting to show test 2 only
('d3',1,'test1',true,true,0),
('d3',2,'test2',true,false,100),
('d3',3,'test3',true,false,200),
-- case 4: test 2 bad on first try, second time good, expecting to show test 3 only
('d4',1,'test1',true,true,0),
('d4',2,'test2',false,false,100),
('d4',3,'test2',true,true,0),
('d4',4,'test3',true,true,0)
)
select * from measurements
where is_last_measurement_on_test=true
现在,我想根据每个设备的以下条件来筛选这些行:
- 只应考虑每个测试上的最后一次测量->;这很简单:筛选IS_LAST_MEASURATION_ON_TEST=TRUE
- 对于每个设备:如果在IS_LAST_MEASURATION_ON_TEST=TRUE的任何测试中出现错误结果(ok=FALSE),我希望显示设备失败的第一个测试.
- 对于每个设备:如果在IS_LAST_MEASURATION_ON_TEST=TRUE的任何测试中没有任何坏结果(ok=TRUE),我希望显示设备通过的最后一次测试.
对于上面的给定示例,我希望只显示以下行:
('d1',3,'test3',true,true,0)
('d2',2,'test2',true,false,100)
('d3',2,'test2',true,false,100)
('d4',4,'test3',true,true,0)
我怎么才能收到这个结果呢?我已经try 了很多次使用first_value,例如
first_value(nullif(error_code,0)) over (partition by device_id)
但我没能以我想要的方式处理它.