请考虑以下Repair_Table的汽车维修车间。
我想在给定的一天内获得每辆车的最后一次“Repair_Status”值。
“Repair_Update”列将在汽车修理过程中为每次更改添加一个新条目:如修复状态,修复名称或修复团队以及修复子任务,这些更改存储在不同的表中。
我尝试了这个查询,但它没有给我我需要的东西:
select distinct(Car_ID), Repair_Status
from Repair_Table r1
left join (select Car_ID, max(Repair_Update) from Repair_Table
group by Car_ID) r2
on r2.Repair_Update = r1.Repair_Update
where convert(date,Repair_Start) = '20180122'
窗口函数是一种简单的方法:
select rt.*
from (select rt.*,
row_number() over (partition by car_id, cast(repair_update as date)
order by repair_update desc
) as seqnum
from Repair_Table rt
where convert(date, Repair_Start) = '20180122'
) rt
where seqnum = 1;
如果您希望在多个日期 - 甚至所有日期都需要此信息,则可以删除where
子句。
使用row_number()函数:
select Car_ID, Repair_Status
from (
select Car_ID, Repair_Status
row_number() over (partition by Car_ID order by Repair_Update desc) as rnk
from Repair_Table
) t
where t.rnk = 1