Запрос приоритета SQL
-
20-08-2019 - |
Вопрос
У меня есть таблица ведения журнала, которая состоит из трех столбцов.Один столбец является уникальным идентификатором, один столбец называется "Имя", а другой - "Статус".
Значения в столбце Имя могут повторяться, так что вы можете видеть имя "Джо" в нескольких строках.Имя "Джо" может содержать строку со статусом "открыто", другую строку со статусом "закрыто", еще одну со статусом "ожидание" и, возможно, одну для "удержания".Я хотел бы, используя определенный приоритет в этом порядке от самого высокого к самому низкому: ("Закрыто", "Удержание", "Ожидание" и "Открыто"), выбрать строку с самым высоким рейтингом для каждого имени и игнорировать остальные.Кто-нибудь знает простой способ сделать это?
Кстати, не каждое имя будет иметь все представления статуса, поэтому у "Джо" может быть только строка для "ожидания" и "удержания", или, может быть, просто "ожидание".
Решение
Я бы создал вторую таблицу с именем что-то вроде "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]