我有一个有三列的记录表。一列是唯一标识符,一列称为“名称”,另一列称为“状态” “名称”列中的值可以重复,以便您可以在多行中看到名称“Joe”。名称“Joe”可能有一行状态为“open”,另一行状态为“closed”,另一行为“waiting”,另一行为“hold”。我想,在这个从最高到最低的顺序使用定义的优先级:(“关闭”,“保持”,“等待”和“打开”)拉出每个名称的最高排名行并忽略其他名称。有人知道一个简单的方法吗?
顺便说一下,并非每个名字都有所有状态表示,因此“Joe”可能只有一行“等待”和“保持”,或者只是“等待”。答案 0 :(得分:4)
我会创建一个名为“Status_Precedence”的第二个表,其行如:
Status | Order
---------------
Closed | 1
Hold | 2
Waiting | 3
Open | 4
在您对另一个表的查询中,请加入此表(在Status_Precedence.Status
上),然后您可以ORDER BY Status_Precedence.Order
。
答案 1 :(得分:4)
如果您不想创建另一个表,可以使用SELECT CASE
指定数字优先级Select Name, Status, Case Status
When 'Closed' then 1
When 'Hold' then 2
When 'Waiting' then 3
When 'Open' Then 4
END
as StatusID
From Logging
Order By StatusId -- Order based on Case
查找表也是一个很好的解决方案。
答案 2 :(得分:0)
我最终使用了matt b的解决方案,并使用这个最终查询来筛选排名较低的排名(较低的排名较高的数字)。
SELECT * from [TABLE] tb
LEFT JOIN Status_Precedence sp ON tb.Status = sp.Status
WHERE sp.Rank = (SELECT MIN(sp2.rank)
FROM[Table] tb2
LEFT JOIN Status_Precedence sp2 ON tb2.Status = sp2.Status
WHERE tb.Status = tb2.Status)
order by tb.[name]