SQL 查询以使用 row_number 通过分区获得聚合结果

SQL query to get the aggregate results using row_number over partition by

我有table像下面的

car_id part_name diagnosis
car_1 windscreen good
car_1 brakes good
car_1 tyres good
car_1 wipers good
car_2 windscreen good
car_2 brakes good
car_2 tyres threadwornout
car_2 wipers replacewiper
car_3 windscreen good
car_3 brakes NULL
car_3 tyres NULL
car_3 wipers NULL
car_4 windscreen NULL
car_4 brakes NULL
car_4 tyres NULL
car_4 wipers NULL
car_5 windscreen chipped
car_5 brakes NULL
car_5 tyres NULL
car_5 wipers NULL

此 table 中的所有汽车都将具有 table 中显示的仅有的四个 part_names(挡风玻璃、刹车、轮胎和雨刷)。根据我想要的诊断字段对汽车进行分类。

根据上述条件,结果集中的结果字段如下

所以结果集应该像下面的table

car_id outcome
car_1 good
car_2 needs_work
car_3 unknown
car_4 unknown
car_5 needs_work

我尝试使用 ROW_NUMBER() OVER (PARTITION BY c.car_id ORDER BY c.diagnosis DESC) 但我没有得到想要的结果。

create table carhealthreport
(
  car_id nvarchar(25)
  ,part_name nvarchar(25)
  ,diagnosis nvarchar(25)

)


insert into carhealthreport values ('car_1',  'windscreen' ,'good') 
                                    ,('car_1',  'brakes'     ,'good')
                                    ,('car_1',  'tyres'      ,'good')
                                    ,('car_1',  'wipers'     ,'good')
                                    ,('car_2',  'windscreen' ,'good')
                                    ,('car_2',  'brakes'     ,'good')
                                    ,('car_2',  'tyres'      ,'threadwornout')
                                    ,('car_2',  'wipers'     ,'replacewiper')
                                    ,('car_3',  'windscreen' ,'good')
                                    ,('car_3',  'brakes'     ,NULL)
                                    ,('car_3',  'tyres'      ,NULL)
                                    ,('car_3',  'wipers'     ,NULL)
                                    ,('car_4',  'windscreen' ,NULL)
                                    ,('car_4',  'brakes'     ,NULL)
                                    ,('car_4',  'tyres'      ,NULL)
                                    ,('car_4',  'wipers'     ,NULL)
                                    ,('car_5',  'windscreen','chipped')
                                    ,('car_5',  'brakes'    ,NULL)
                                    ,('car_5',  'tyres'     ,NULL)
                                    ,('car_5',  'wipers'    ,NULL)

我认为您可以通过汇总和 conditional case expressions

获得想要的结果
select car_id,
    case when Sum(case when diagnosis='good' then 1 end) =4 then 'good' 
    else
        case when Sum(case when IsNull(diagnosis,'good')='good' then 1 end) =4 then 'unknown'
        else 'needs_work'
        end
    end Outcome
from carhealthreport
group by car_id
order by car_id

Demo Fiddle

假设每个 car_Id 总是 4 行,如果这是可变的,您可以使用 count(*)