2011-03-01 6 views
1

클라이언트에 설치된 소프트웨어의 버전을 저장하는 테이블이 있습니다. 가장 높은 버전 값을 반환해야합니다. 값이 2.3.0.99와 같은 형식이므로 MAX (versionValue)는 가장 높은 값을 반환하지 않습니다. 가장 높은 값이 2.3.0.122이면 MAX는 2.3.0.99를 가장 높은 값으로 반환하며 이는 사실이 아닙니다. 나는 이것이 꽤 사소한 것이라고 확신한다, 나는 벽을 치고 구글은 지금 도움이되지 않는다. 모든 통찰력은 인정 될 것이다.소수점이있는 최대 값

+1

SQL Server는 versionValue를 string으로 처리합니다. GetLatestVersion을 사용하여 마지막 버전을 검색하는 자체 함수를 작성해야합니다. 또는 버전 값을 저장하고 getdate()를 기본값으로 사용하여 날짜순으로 정렬 된 마지막 버전 값을 내림차순으로 선택하는 테이블에 날짜 열을 추가 할 수 있습니다. –

답변

0

모두에게 감사드립니다. CLR로 UDF를 작성했습니다. DB는 타사 제품과 연결되어 있으므로 스키마를 재구성하는 것은 선택 사항이 아닙니다.

+1

UDF 또는 사용자 정의 집계? 후자가 더 적합 해 보입니다. –

+0

죄송합니다, 사용자 정의 집합 :) –

0

데이터베이스 스키마를 변경하고 버전을 가정하는 것은 항상 빌드,

심각, 경미 네 개의 새 열을 추가 할 수와 같은 형식, 개정판

를 다음 수 있다면 이러한 모든 int 치의 당신이 할 수있을 것 다음 중 하나를 사용자 문자열 concatination는 버전 번호 2.3.0.122를 제공하거나, 예를 들어 최대 버전을 얻을 산수를 사용

(* 1000 주요) + (마이너 * 100) +에 (* 10 빌드) + 개정

이슈 만 e를 사용하면 전체 테이블 스캔을 수행하여 가장 높은 것이 무엇인지 알아 내야하며, 사소한 릴리스가 너무 높아서 중요한 릴리스가 필요한 문제가 발생할 수 있습니다.

하지만 확실한 아이디어를 얻으실 수 있습니다.

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