我有一个"Order"Table which houses "Status"Column. Values under Status = ('Completed','Sold','In-Process','Released','NotStarted')
。
即使表中没有序列或层次结构,我们也可以如下感知序列。
1 NotStarted 2 Released 3 In-Process 4 Sold 5 Completed
因此,“已完成”是最高状态,每个订单都要经过这些状态,直到它们完成为止。如果尚未完成,则应处于其他状态之一。
当我筛选完成时,我会错过其他记录。当我包含所有状态时,我会获得多个相同订单的记录,例如1个记录为Released,1个记录为InProcess,等等(即订单的各个阶段)
select * from OrderTable where Status = 'Completed'
我想有能力做这样的事情-
COALESCE(Completed,Sold,In-Process,Released,NotStarted, NULL)
换句话说,我想获得该状态的最高记录,而每个订单仅获得1条记录。
这可能在Sql中吗?
一种选择是ROW_NUMBER()
与Case表达式一起使用以建立您的订单。
SELECT * FROM ( SELECT OrderNumber, Status, ROW_NUMBER() OVER (PARTITION BY OrderNumber ORDER BY CASE Status WHEN 'NotStarted' THEN 1 WHEN 'Released' THEN 2 WHEN 'In-Process' THEN 3 WHEN 'Sold' THEN 4 WHEN 'Completed' THEN 5 END DESC) as Order_Status_Rank FROM OrderTable ) dt WHERE Order_Status_Rank = 1;
在这里看到它的作用