Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запрос на выборку максимального значения

52K
02 ноября 2009 года
holden
6 / / 02.11.2009
Приветствую всех. Вот уже месяц не могу корректно составить запрос.
Суть проблемы в следующем: имеется таблица содрежащая версии различных систем. Нужно вывести максимальную версию каждой системы. Системы должны быть по одной. В некоторых случаях GROUP BY мне не помогал. Результат вывода должен содержать Номер, Систему, Версию, Дату. Проблема в том, что номера версий приводятся как 1.1, 1.2, 1.3, ... , 1.11, 1.12. Получается, что число 1.3 больше чем, 1.12, но именно версия 1.12 больше. Есть закономерность. Максимальный номер у каждой заявки соответствует максимальной версии системы, но связать их так и не получилось.
Пример БД во вложении.
Буду очень признателен за решение проблемы.

PS База прикручена к сайту по ODBC.
51K
02 ноября 2009 года
laba
16 / / 20.08.2009
Отдели номер версии от подверсии. Например, в 1.13 номер версии будет 1, а подверсия 13. Затем сделай вспомогательное число, которое поможет тебе установить нужный порядок между версиями. Возвращаясь к примеру, 1*100+13= 113 - сдвинул номер версии относительно подверсии на два десятичных знака.
325
02 ноября 2009 года
Franky
723 / / 10.08.2005
хм, с текстом запроса не помогу, но что если выбирать (сравнивать) версии как строковую переменную?
52K
02 ноября 2009 года
holden
6 / / 02.11.2009
Цитата: laba
Отдели номер версии от подверсии. Например, в 1.13 номер версии будет 1, а подверсия 13. Затем сделай вспомогательное число, которое поможет тебе установить нужный порядок между версиями. Возвращаясь к примеру, 1*100+13= 113 - сдвинул номер версии относительно подверсии на два десятичных знака.



В примере помимо столбца с версиями есть 2 столбца с разбитыми версиями, так тоже пробовали. Возвращать по max(ver) & max(podver). Но начинается чихарада. Если есть версия 6.1 и 5.9, то возврат будет 6.9. Ещё проблема в том, что нужно возвращать одним запросом, возможности обработать полученные результаты нет. Вот и ломаю голову с переменными подходами уже месяц.

52K
02 ноября 2009 года
holden
6 / / 02.11.2009
Цитата: Franky
хм, с текстом запроса не помогу, но что если выбирать (сравнивать) версии как строковую переменную?



В базе версия хранится как раз как строка. Пробовал функцию перевода строки в число (точно помню какую), результат запроса улучшился, но корректным полностью не стал.

12K
02 ноября 2009 года
Ghox
297 / / 26.07.2009
Цитата: holden
В примере помимо столбца с версиями есть 2 столбца с разбитыми версиями, так тоже пробовали. Возвращать по max(ver) & max(podver). Но начинается чихарада. Если есть версия 6.1 и 5.9, то возврат будет 6.9. Ещё проблема в том, что нужно возвращать одним запросом, возможности обработать полученные результаты нет. Вот и ломаю голову с переменными подходами уже месяц.


Можно попробовать такой SQL-запрос (опробовал на примере вашей БД - вроде работает, я только столбцы переименовал, иначе Access ругается на неизвестные функции):

 
Код:
select ar.N, ar.System, ar.Vers, ar.Date from arhiv ar
where not exists
    (select * from arhiv
     where System = ar.System and
           (№vers_ЦелЧасть > ar.№vers_ЦелЧасть or
           (№vers_ЦелЧасть = ar.№vers_ЦелЧасть and
            №vers_ДробЧасть > ar.№vers_ДробЧасть))
    )

Правда, после сохранения Access его преобразует в запрос другого вида, но работает вроде правильно.
52K
02 ноября 2009 года
holden
6 / / 02.11.2009
Цитата: Ghox
Можно попробовать такой SQL-запрос (опробовал на примере вашей БД - вроде работает, я только столбцы переименовал, иначе Access ругается на неизвестные функции)...



Спасибо, но у меня Ваш запрос вернул 59 строк - такое количество всего в таблице. А необходимо по одной системе с максимальной версией. Это порядка 13 строк.

12K
02 ноября 2009 года
Ghox
297 / / 26.07.2009
Цитата: holden
Спасибо, но у меня Ваш запрос вернул 59 строк - такое количество всего в таблице. А необходимо по одной системе с максимальной версией. Это порядка 13 строк.


Странно, у меня нормально работает, правда, при запуске запроса почему-то выдается сообщение The number is too large, но потом окно выполнения запроса открывается и все корректно выводится (13 строк как и говорите).
Прикрепляю дополненную БД - смотрите сами.

51K
02 ноября 2009 года
laba
16 / / 20.08.2009
Код:
select ar.N
       , 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
      )
52K
03 ноября 2009 года
holden
6 / / 02.11.2009
laba, Ghox, всё работает, спасибо большое! Буду тестить на всех базах :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог