Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Если вы не хотите создавать другую таблицу, вы можете назначить числовой приоритет, используя РЕГИСТР ВЫБОРА

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

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

В итоге я использовал решение Мэтта би и использовал этот последний запрос для фильтрации запросов с более низким рейтингом (более низкий 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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top