2011-03-01 57 views
1

我有一個存儲安裝在客戶端上的軟件版本的表。我需要返回最高版本的值。 MAX(versionValue)不會返回最高值,因爲該值的格式類似於2.3.0.99。如果最高值是2.3.0.122,MAX返回2.3.0.99作爲最高值,這是不正確的。我相信這很簡單,我剛剛碰壁,谷歌現在沒有任何幫助。任何洞察力將不勝感激。MAX值與多個小數點

+1

SQL Server在處理versionValue爲字符串。你必須編寫你自己的函數,讓我們說GetLatestVersion來檢索最後的版本。或者,您可能希望在存儲版本值的表中添加日期列,並將getdate()作爲默認值,然後選擇按日期排序的最後一個版本值,降序。 – 2011-03-01 06:31:55

回答

0

謝謝大家。我最終在CLR中創建了一個UDF。數據庫與第三方產品相關聯,因此重建模式不是一種選擇。

+1

UDF或用戶定義的聚集?後者似乎更合適。 – 2011-03-01 18:01:10

+0

抱歉,用戶定義的聚合:) – 2011-03-01 18:04:01

0

如果你可以改變數據庫模式和假設的版本始終遵循您可以添加4個新列的

主要,次要,建立相同的格式,修訂

這些將隨後都是整數你可以那麼無論用戶字符串concatination給出的版本號2.3.0.122或使用arithmatic獲得最大的版本,例如

(主要* 1000)+(次要* 100)+(編譯* 10)+修訂

只有issu因此需要做一個全表掃描來找出最高的是什麼,並且可能存在一個問題,即次要版本太高以至於無法發佈主要版本。

但是我相信你的想法。

0

您正在遇到的問題是,因爲要存儲4條信息中的一列,現在需要分解成構成件。

理想情況下,你應該把你的表格放入1NF,即將它們拆分成4列(然後在其上放置一個複合索引)。

你可以有一個(非持久化)計算列是連接它們進行顯示。

如果這是不可能的下面是不是可優化搜索,但做這項工作。

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