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


Я бы создал вторую таблицу с названием что-то вроде «Status_Precedence» со строками вроде:
Status | Order
---------------
Closed | 1
Hold | 2
Waiting | 3
Open | 4
В вашем запросе другой таблицы выполните соединение с этой таблицей (на Status_Precedence.Status), а затем вы можете ORDER BY Status_Precedence.Order.
ВЫБЕРИТЕ статус из таблицы, порядок из Status_Precedence, где Table.Status = Status_Precedence.Status ORDER BY Status_Precedence ORDER DESC;
"ВЫБРАТЬ Статус из таблицы, заказ из Status_Precedence, где"? Я что-то пропустил?
... ГДЕ Table.Status = Status_Precedence.Status ORDER BY Status_Precedence.Order DESC LIMIT 0,1; «Стол» - это ваш стол - нигде я не видел названия.
Я просто не получаю "Выбрать статус из таблицы", за которым следует запятая?
Ой. Гул. Не знаю, зачем я это сделал. Поздно ночью. ВЫБЕРИТЕ Table.Status, Status_Precedence.Order FROM Table, Status_Precedence ....
Если вы не хотите создавать другую таблицу, вы можете назначить числовой приоритет, используя 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
Тем не менее, справочная таблица также является хорошим решением.
Я закончил тем, что использовал решение 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]
Я согласен с тем, что это существенно упорядочит мои имена и статус, но как тогда мне сохранить только строку с наибольшим номером для каждого имени?