Запрос на выборку максимального значения
Суть проблемы в следующем: имеется таблица содрежащая версии различных систем. Нужно вывести максимальную версию каждой системы. Системы должны быть по одной. В некоторых случаях GROUP BY мне не помогал. Результат вывода должен содержать Номер, Систему, Версию, Дату. Проблема в том, что номера версий приводятся как 1.1, 1.2, 1.3, ... , 1.11, 1.12. Получается, что число 1.3 больше чем, 1.12, но именно версия 1.12 больше. Есть закономерность. Максимальный номер у каждой заявки соответствует максимальной версии системы, но связать их так и не получилось.
Пример БД во вложении.
Буду очень признателен за решение проблемы.
PS База прикручена к сайту по ODBC.
В примере помимо столбца с версиями есть 2 столбца с разбитыми версиями, так тоже пробовали. Возвращать по max(ver) & max(podver). Но начинается чихарада. Если есть версия 6.1 и 5.9, то возврат будет 6.9. Ещё проблема в том, что нужно возвращать одним запросом, возможности обработать полученные результаты нет. Вот и ломаю голову с переменными подходами уже месяц.
В базе версия хранится как раз как строка. Пробовал функцию перевода строки в число (точно помню какую), результат запроса улучшился, но корректным полностью не стал.
Можно попробовать такой SQL-запрос (опробовал на примере вашей БД - вроде работает, я только столбцы переименовал, иначе Access ругается на неизвестные функции):
where not exists
(select * from arhiv
where System = ar.System and
(№vers_ЦелЧасть > ar.№vers_ЦелЧасть or
(№vers_ЦелЧасть = ar.№vers_ЦелЧасть and
№vers_ДробЧасть > ar.№vers_ДробЧасть))
)
Правда, после сохранения Access его преобразует в запрос другого вида, но работает вроде правильно.
Спасибо, но у меня Ваш запрос вернул 59 строк - такое количество всего в таблице. А необходимо по одной системе с максимальной версией. Это порядка 13 строк.
Странно, у меня нормально работает, правда, при запуске запроса почему-то выдается сообщение The number is too large, но потом окно выполнения запроса открывается и все корректно выводится (13 строк как и говорите).
Прикрепляю дополненную БД - смотрите сами.
, ar.System
, ar.Vers
, ar.Date
from arhiv ar
where (№vers_ЦелЧасть * 100 + №vers_ДробЧасть)
= (
select max( №vers_ЦелЧасть * 100 + №vers_ДробЧасть)
from arhiv b
where ar.System = b.System
)