Максимальное значение с несколькими десятичными точками - PullRequest
1 голос
/ 01 марта 2011

У меня есть таблица, в которой хранятся версии программного обеспечения, установленного на клиенте.Мне нужно вернуть самое высокое значение версии.MAX (versionValue) не возвращает наибольшее значение, поскольку оно имеет формат, подобный 2.3.0.99.Если самое высокое значение 2.3.0.122, MAX возвращает 2.3.0.99 как самое высокое значение, что не соответствует действительности.Я уверен, что это довольно тривиально, я только что врезался в стену, и Google сейчас не помогает.Любое понимание будет оценено.

Ответы [ 3 ]

0 голосов
/ 01 марта 2011

Проблема, с которой вы столкнулись, заключается в том, что вы храните 4 элемента информации в одном столбце, и теперь вам нужно разбить их на составляющие элементы.

В идеале вы должны поместить свою таблицу в 1NF, то есть разбить их на 4 int столбцы (а затем поместить в них составной индекс).

Вы можете иметь (не сохраняемый) вычисляемый столбец, который объединяет их для отображения.

Если это невозможно, следующее не может быть сарказмом, но выполняет работу.

DECLARE @versions TABLE (
  version_number varchar(15),
  productid      int )

INSERT INTO @versions
SELECT '2.3.0.122',1 UNION ALL 
SELECT '2.3.0.99',1 UNION ALL 
SELECT '2.3.0.122',2 UNION ALL 
SELECT '2.4.0.99',2;

WITH cte
     AS (select productid,
                version_number,
                ROW_NUMBER() over (partition by productid 
                                       order by CAST('/' +
                   version_number + '/' AS hierarchyid) desc) AS RN
         FROM   @versions)
SELECT productid,
       version_number
FROM   cte
WHERE  RN = 1  
0 голосов
/ 01 марта 2011

Спасибо всем. В итоге я создал UDF в CLR. БД связана со сторонним продуктом, поэтому восстановление схемы не было возможным.

0 голосов
/ 01 марта 2011

Если вы можете изменить схему базы данных и, если версия всегда соответствует одному и тому же формату, вы можете добавить четыре новых столбца для

Major, Minor, Build, Revision

В таком случае это будут целые числа, которые можно затем объединить с пользовательской строкой, чтобы получить номер версии 2.3.0.122, или использовать арифметику, чтобы получить максимальную версию, например

(Major * 1000) + (Minor * 100) + (Build * 10) + Revision

Единственная проблема, которая возникает из-за этого, заключается в том, что необходимо выполнить полное сканирование таблицы, чтобы выяснить, какой из них самый высокий, и могут возникнуть проблемы, когда второстепенный выпуск настолько высок, что он переходит в основной выпуск.

Но я уверен, что вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...