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(挡风玻璃、刹车、轮胎和雨刷)。根据我想要的诊断字段对汽车进行分类。
- 如果一辆车所有诊断结果都很好那么结果就很好
- 如果一辆车 至少有一个诊断结果不好且不为 NULL 那么结果是 needs_work
- 如果一辆车 所有 4 项诊断均为 NULL 或(NULL 和良好诊断的组合) 那么结果未知
根据上述条件,结果集中的结果字段如下
- car_1 有 4 个好的诊断所以结果很好
- car_2 有 2 个诊断结果不好,所以结果是 needs_work
- car_3 有 1 个良好诊断和 3 个 NULLS,因此结果未知
- car_4 所有 4 项诊断均为 NULl,因此结果未知
- car_5 有一项诊断不好,所以结果是需要工作
所以结果集应该像下面的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
假设每个 car_Id 总是 4 行,如果这是可变的,您可以使用 count(*)
。
我有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(挡风玻璃、刹车、轮胎和雨刷)。根据我想要的诊断字段对汽车进行分类。
- 如果一辆车所有诊断结果都很好那么结果就很好
- 如果一辆车 至少有一个诊断结果不好且不为 NULL 那么结果是 needs_work
- 如果一辆车 所有 4 项诊断均为 NULL 或(NULL 和良好诊断的组合) 那么结果未知
根据上述条件,结果集中的结果字段如下
- car_1 有 4 个好的诊断所以结果很好
- car_2 有 2 个诊断结果不好,所以结果是 needs_work
- car_3 有 1 个良好诊断和 3 个 NULLS,因此结果未知
- car_4 所有 4 项诊断均为 NULl,因此结果未知
- car_5 有一项诊断不好,所以结果是需要工作
所以结果集应该像下面的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
假设每个 car_Id 总是 4 行,如果这是可变的,您可以使用 count(*)
。