1

我有一个包含三列的日志记录表。一列是唯一标识符,一列称为“名称”,另一列是“状态”。
Name 列中的值可以重复,因此您可能会在多行中看到名称“Joe”。名称“Joe”可能有一行状态为“open”,另一行状态为“closed”,另一行状态为“waiting”,可能还有一个状态为“hold”。我想使用从最高到最低顺序定义的优先级:("Closed","Hold","Waiting" and "Open") 为每个 Name 拉出排名最高的行并忽略其他行。任何人都知道一个简单的方法来做到这一点?

顺便说一句,并不是每个 Name 都会有所有的状态表示,所以“Joe”可能只有一行用于“等待”和“等待”,或者可能只是“等待”。

4

3 回答 3

4

我会创建一个名为“Status_Precedence”的第二个表,其行如下:

Status  | Order
---------------
Closed  |  1
Hold    |  2
Waiting |  3
Open    |  4

在您对另一个表的查询中,对该表进行连接(on Status_Precedence.Status),然后您就可以了ORDER BY Status_Precedence.Order

于 2008-12-08T15:43:53.137 回答
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

查找表也是一个很好的解决方案。

于 2008-12-08T15:51:45.743 回答
0

我最终使用了 matt b 的解决方案并使用这个最终查询来过滤掉排名较低的(较低的 bing 编号较高)。

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]
于 2008-12-08T17:21:46.700 回答