SQL приоритет запроса - PullRequest
       24

SQL приоритет запроса

1 голос
/ 08 декабря 2008

У меня есть таблица регистрации, которая имеет три столбца. Один столбец является уникальным идентификатором, один столбец называется «Имя», а другой - «Статус».
Значения в столбце «Имя» могут повторяться, чтобы вы могли видеть имя «Джо» в нескольких строках. У имени «Джо» может быть строка со статусом «открыто», другая строка со статусом «закрыт», другая со словом «ожидание» и, возможно, одна со словом «удерживать». Я хотел бы, используя определенный приоритет в этом порядке от высшего к низшему :( «Закрыто», «Удерживать», «Ожидание» и «Открыть») извлекает строку с самым высоким рейтингом для каждого Имени и игнорирует другие. Кто-нибудь знает простой способ сделать это?

Кстати, не каждое Имя будет иметь все представления статуса, поэтому у «Джо» может быть только строка «ожидание» и «удержание», или, может быть, просто «ожидание».

Ответы [ 3 ]

4 голосов
/ 08 декабря 2008

Если вы не хотите создавать другую таблицу, вы можете назначить числовой приоритет, используя 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

Справочная таблица также является хорошим решением.

4 голосов
/ 08 декабря 2008

Я бы создал вторую таблицу с именем что-то вроде «Status_Precedence» со строками вроде:

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

В запросе к другой таблице выполните объединение с этой таблицей (на Status_Precedence.Status), и тогда вы сможете ORDER BY Status_Precedence.Order.

0 голосов
/ 08 декабря 2008

Я закончил тем, что использовал решение Мэтта Б и использовал этот последний запрос, чтобы отфильтровать более низкий рейтинг (более низкий номер выше).

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]
...