2010-05-19 2 views
1

당신은 PK가 기본 키입니다 아래의 select 문이있는 경우 :SQL : 커서가 없으면 dups에 대해 고유 한 정수 ID (동일성)를 만드는 레코드를 선택하는 방법은 무엇입니까?

select distinct dbo.DateAsInt(dateEntered) * 100 as PK, 
       recordDescription as Data 
from MyTable 

및 출력 (첫 번째 숫자가 명확하게 이격되어있다)이 같은 것입니다 :

 PK    Data 
2010 01 01 00 New Years Day 
2010 01 01 00 Make Resolutions 
2010 01 01 00 Return Gifts 
2010 02 14 00 Valentines day 
2010 02 14 00 Buy flowers 

당신을

 PK    Data 
2010 01 01 01 New Years Day 
2010 01 01 02 Make Resolutions 
2010 01 01 03 Return Gifts 
2010 02 14 01 Valentines day 
2010 02 14 02 Buy flowers 

PK의 "00"을 단일 셀 내에서 "ID"번호 효과를 만들 수 있습니까? 요법? 그렇지 않으면, 어떻게 그 날짜에 발견 된 활동마다 1 씩 증가시킬 수 있습니까?

나는 그룹과 함께 Sum (사례가 ?? then then end)과 같은 것을 시도하기 위해 타이핑 할 때 이미 생각하고있다.

편집 : (아래 JohnFX에서 제공하는 응답)

이 최종 대답했다 :

select PK + row_number() over 
      (PARTITION BY eventid order by eventname) as PK, 
      recordDescription 
from  (select distinct -- Removes row counts of excluded rows) 
        dbo.DateAsInt(dateEntered) as PK, 
        recordDescription as Data 
      from  MyTable) A 
order by eventid, recordDescription 

답변

3

난 당신이 ROW_NUMBER 및 관련 PARTITION 절을 찾고있다 생각합니다.

SELECT DISTINCT dbo.DateAsInt(DateEntered) * 100 as PK, 
       ROW_NUMBER() OVER (PARTITION BY DateEntered ORDER BY recordDescription) as rowID, 
       recordDescription as Data 
FROM MyTable 

DateEntered 중복 값이있는 경우는 아마도 이러한 경우에 증 분기에 무엇을해야하는지에 대한 귀하의 특정 요구에 따라 DENSE_RANK()RANK()을 확인하고 싶다.

+0

이것은 성공 가능성이 매우 높습니다. 지금까지, 나는 각 날짜에 대해 구별되는 숫자를 얻고 있지만 여전히 각각의 시작을 1에서 시작하여 하나씩 증가 시키려고 노력하고있다. (나는 5,7,15,2와 같은 가치를 얻는다). 내가 입력 할 때 나는 옵션에 대해 읽고있다. 매우 유망한 대답. 감사. –

+0

확실히 정답입니다. 고유 쿼리를 하위 쿼리로 이동 한 다음 결과에 대한 partition보다 row_number를 사용해야했습니다. 완벽하게 일했습니다. 별명이 적용되기 전에 row_number가 행을 세고있었습니다. 감사! –

+0

그렇다면, 제외 된 행을 계산하지 않는 Row_Number()에 대한 옵션이 있다고 확신합니다. 그 방법을 모르겠다. (별개의 서브 쿼리와 같은 효과를 시뮬레이션해라.) –

2

날짜/시간 열을 절대로 기본 키로 사용해서는 안됩니다. 당신이 indetity 열이 있다면 또한, 당신은 할 수 없었다 : 2010 02 14 01 같은 정체성을 것

 PK    Data 
2010 01 01 01 New Years Day 
2010 01 01 02 Make Resolutions 
2010 01 01 03 Return Gifts 
2010 02 14 01 Valentines day 
2010 02 14 02 Buy flowers 

2010 01 01 01으로.

가장 좋은 방법은 식별 열을 분리하고 다른 열에 휴일 날짜를 넣은 다음 각 필드의 값을 nvarchar으로 연결하는 것입니다.

+0

사과. 열과 같은 ID. 날짜는 2010010100 + 그룹의 행 번호로 끝납니다 (예 : 귀하의 예를 보여줍니다. 이것은 뷰의 PK가되어 다른 시스템간에 다른 테이블을 공급합니다. 조언을 위해 –

+0

+1. 궁극적으로이 기술을 여러 번 실행하면 정렬 순서에 따라 다르므로 동일한 PK가 생성되지 않습니다. –

관련 문제