2012-12-05 5 views
2

일부 트리거 솔루션이 이미이 문제를 다루지 만 사전에 사과드립니다. 그러나 제 시나리오에서 제대로 작동하지 못합니다.고유 키를 기반으로 SQL에서 값을 증가시키는 방법

나는 약 5000 개의 고유 ID 값을 가진 ID을 가진 50,000 개의 행이있는 테이블이 있습니다. 테이블 등 내에 instrumentID = 1instrumentID = 2이있는 100 개의 행이있을 수 있지만 약간 다른 열 항목이 있습니다. 그래서 (나는이 쉽게 물건입니다 알고 있지만 단지 명확하게하기 위해)

은 내가해야 할 것은 때마다 악기에 대한 증분 값을 형성하는

SELECT * from tbl WHERE instrumentID = 1 

를 작성하고 100 개 행을 반환 할 수 ID가 발견되었으므로 다음과 같은 내용을 시도했습니다.

IntIndex INT IDENTITY(1,1), 
    dDateStart DATE, 
    IntInstrumentID INT, 
    IntIndex1 AS IntInstrumentID + IntIndex, 

테이블 작성 단계.

그러나, 나는 instrumentID이 발견 될 때 IntIndex1 관계없이 효과적으로 혼자 마지막 IntIndex1 값을보고 레코드 수를 제공 할 수 있도록 레코드가 테이블에서 발견되는 경우에, 증가해야합니다. 오히려 위가 무엇보다 관계없이 instrumentID의 테이블의 모든 행에 증가 그래서 당신은 얻을 것입니다있는 500140024003 등

예제는 다음과 같습니다 intInstruments 5000 및 4000

intInstrumentID | IntIndex1 
--------- ------------------ 
    5000   | 5001 
    5000   | 5002 
    4000   | 4001 
    5000   | 5003 
    4000   | 4002 
에 대한

이 값을 기반으로 두 테이블을 조인해야하기 때문에 (각 instrumentID의 시작 및 끝 날짜)이 작업을 수행해야하는 이유가 있습니다. GROUP BY 등을 시도했지만 두 테이블 모두에서 작동하지 않으며 JOIN이 작동하지 않습니다.

많은 감사

답변

1

당신은 오히려 사실에 계산 된 값을 유지하는 것보다, 다음 쿼리에 가입 수, 당신의 문제를 이해하지만 그냥 IntIndex1가 가입해야 할 경우 완전히 확실하지 않다 데이터베이스 :

SELECT *, 
     intInstrumentID + RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1 
FROM tbl 

편집 : 나는 (! 특정하지 않은)가 제대로 귀하의 의견을 이해한다면, 아마, 당신은 당신의 종료 날짜와 시작 날짜 테이블로 연결 행의 동일한 번호를 가지고 것을 알고있다 계측기 ID 내의 각각의 종료일을 기준으로 한 일대일 매핑 그렇지 않으면

SELECT SD.intInstrumentID, SD.dDateStart, ED.dEndDate 
FROM 
(
    SELECT intInstrumentID, 
      dStartDate, 
      RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1 
    FROM tblStartDate 
) SD 
JOIN 
(
    SELECT intInstrumentID, 
      dEndDate, 
      RANK() OVER(PARTITION BY intInstrumentID ORDER BY dEndDate ASC) AS IntIndex1 
    FROM tblStartDate 
) ED 
    ON SD.intInstrumentID = ED.intInstrumentID 
    AND SD.IntIndex1 = ED.IntIndex1 

, 당신은 두 테이블과 예상되는 결과에 대한 몇 가지 예를 들어 데이터를 게시 할 예정하십시오

그 다음 케이스라면 어쩌면이 조인에 당신이 찾고있는 무엇인가?

+0

괜찮은 답변입니다. 실제 열을 원하면 새로운 열을 추가하고 이와 같이 채우십시오. 당신의 악기 ID가 1000, 2000, 3000이면 괜찮습니다. 1, 2, 3, 1, 2이면 1이 11이되어 12로 바뀌므로 엉망이됩니다. 그래서 작은 추가, 마침표를 추가하고 열을 10 진수로 만드십시오. 그래서 당신은 11을 11과 12 대신에 1.1과 1.2로 바꿉니다. –

+0

당신의 답변을 주셔서 감사합니다. Fergus; 내가 가지고있는 것은 증분 된 instrumentID에 함께 결합되어야하는 2 개의 테이블이며, 모든 시작 날짜에 해당 종료 날짜가 있습니다 (그리고 오직 1 개).따라서 "시작 날짜"테이블과 "종료 날짜"테이블이 있으며 각각은 날짜 순서로 증가해야 JOIN 다음의 최종 테이블에서 종료 날짜 옆에 시작 날짜가 오게됩니다. RANK 함수는 유용하지만 최상위 순위에 대해 1을 반환 한 다음 2 개 등을 반환하지만 파티션 내에서 증분해야합니다. 또한 나를 소개해 주셔서 감사합니다. – user1878878

+0

Fergus에게 감사드립니다. 당신은 대답은 오늘 제가 여기 쓰기 위해 온 것과 거의 동일하지만 CREATE 테이블에서 RANK OVER를 쓰고 있습니다. 이것은 두 테이블에서 무작위 샘플을 검증 할 수 있기를 원하기 때문입니다. – user1878878

관련 문제