【问题标题】:SQL Precedence QuerySQL 优先级查询
【发布时间】:2008-12-08 15:39:42
【问题描述】:

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

顺便说一句,并不是每个名称都具有所有状态表示,因此“Joe”可能只有一行用于“等待”和“等待”,或者可能只是“等待”。

【问题讨论】:

    标签: sql operator-precedence


    【解决方案1】:

    我将创建第二个名为“Status_Precedence”之类的表,其行如下:

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

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

    【讨论】:

    • 我同意这实际上会对我的姓名和状态进行排序,但是我如何只保留每个姓名的最高编号的行?
    • SELECT Status from Table,Order from Status_Precedence where Table.Status = Status_Precedence.Status ORDER BY Status_Precedence ORDER DESC;
    • "SELECT Status from Table,Order from Status_Precedence where"?我错过了什么吗?
    • ... WHERE Table.Status = Status_Precedence.Status ORDER BY Status_Precedence.Order DESC LIMIT 0,1; “表”是你的表——我在任何地方都看不到名字。
    • 我只是没有得到“从表中选择状态”后跟逗号?
    【解决方案2】:

    如果您不想创建另一个表,可以使用 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
    

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

    【讨论】:

      【解决方案3】:

      我最终使用了 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]
      

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        相关资源
        最近更新 更多