MAX值,带有多个小数点

时间:2011-03-01 06:26:21

标签: sql-server-2008

我有一个表,用于存储客户端上安装的软件版本。我需要返回最高版本值。 MAX(versionValue)不返回最高值,因为该值的格式为2.3.0.99。如果最高值为2.3.0.122,则MAX返回2.3.0.99作为最高值,这不是真的。我确定这是非常微不足道的,我刚刚碰壁,谷歌现在没有帮助。任何见解都将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果您可以更改数据库架构并假设版本始终遵循相同的格式,则可以为

添加四个新列

主要,次要,构建,修订

然后这些都是整数,然后你可以用户字符串连接给出版本号2.3.0.122或使用arithmatic来获取最大版本例如

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

唯一的问题是它需要进行全表扫描以找出最高的是什么,并且可能存在次要版本高到超过主要版本的问题。

但我相信你明白了。

答案 1 :(得分:0)

您遇到的问题是因为您将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  

答案 2 :(得分:0)

谢谢大家。我最终在CLR中创建了一个UDF。数据库与第三方产品相关联,因此重建模式不是一种选择。