1

3 つの列を持つログ テーブルがあります。1 つの列は一意の識別子で、1 つの列は「名前」、もう 1 つは「ステータス」です。
名前列の値は繰り返すことができるため、複数の行に「Joe」という名前が表示される場合があります。名前「Joe」には、ステータスが「open」の行、ステータスが「closed」の別の行、「waiting」の別の行、および「hold」の行が含まれる場合があります。この最高から最低の順序で定義された優先順位を使用して、("Closed","Hold","Waiting" and "Open") 各名前の最高ランクの行を引き出し、他の行を無視したいと思います。これを行う簡単な方法を知っている人はいますか?

ところで、すべての名前にすべてのステータス表現があるわけではないため、「Joe」には「待機中」と「保留」の行のみ、または単に「待機中」の行しかない場合があります。

4

3 に答える 3

4

次のような行を持つ、「Status_Precedence」のような名前の 2 つ目のテーブルを作成します。

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

私は最終的にマット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]
于 2008-12-08T17:21:46.700 に答える