2012-02-23 3 views
0

사용자 ID가 DIFFTIME 인 테이블이 있습니다. 테이블에서이 열을 선택하면 다음과 같은 파생 열을 갖기를 원합니다. DiffTime이 20보다 크면 사용자 ID 당 개수를 늘리고 싶습니다.기준에 따라 행 번호를 생성하는 SQL SERVER

예를 들어 테이블이있는 경우 :이 작업을 수행하려면 어떻게

User ID DIFF TIME SESSION NUMBER 
    1  0  1 
    1  5  1 
    1  10  1 
    2  0  1 
    2  21  2 
    2  5  2 

:

User ID DIFF TIME 
1  0 
1  5 
1  10 
2  0 
2  21 
2  5 

나는이 같은 것입니다 결과 세트를합니다.

아이디어와 제안 사항을 높이 평가합니다.

+1

테이블에이 두 열만 있습니까? 주문을 지시하기 위해 뭔가 다른 것이 필요할 것 같습니다. 쿼리는 0이 5와 5가 발생하기 전에 발생한다는 것을 알 수 없습니다. 또한 예상 출력에서 ​​오타가 21 개입니까? –

+0

@Aaron : 내가 가지고있는 다른 컬럼은 eventTime..Nope 21은 오타가 아닙니다 ... difftime이 20보다 크면 카운트를 증가시킵니다. – SaiBand

+0

21은 카운트 σ를 나타내고, 원래 데이터에서 20은 시간을 나타내지 않습니까? 세션 번호 또는 시간을 늘리시겠습니까? 나는 분명히 여기에서 길을 잃었다. –

답변

1
create table #t 
(
id int, 
Diff int, 
SessionNumber int 
) 
insert into #t(id, diff)values(1, 0) 
insert into #t(id, diff)values(1, 5) 
insert into #t(id, diff)values(1, 10) 
insert into #t(id, diff)values(2, 0) 
insert into #t(id, diff)values(2, 21) 
insert into #t(id, diff)values(2, 5) 


Select ROW_NUMBER() over(order by Id) as RowID, * into #Temp1 from #t 
Declare @diff int 
Declare @RowId int 
Declare @Previous int 
Declare @NewValue int 

DECLARE @Cur CURSOR SET @Cur = CURSOR FOR select RowId, diff from #Temp1 
OPEN @Cur 
FETCH NEXT FROM @Cur INTO @RowId, @diff 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    if(@RowId = 1) 
    Begin 
     Update #Temp1 Set SessionNumber = 1 Where rowid = 1  
     Set @Previous = @Diff 
     Set @NewValue = 1 
    End 
    Else 
    Begin 
     if(@Diff - @Previous > 20) 
     Begin 
      Set @Previous = @Diff 
      Set @NewValue = @NewValue + 1 
      Update #Temp1 Set SessionNumber = @NewValue Where rowid = @RowId 
     End 
     else 
      Update #Temp1 Set SessionNumber = @NewValue Where rowid = @RowId 

    End 
    FETCH NEXT FROM @Cur INTO @RowId, @diff 
END 
CLOSE @Cur 
DEALLOCATE @Cur 

select * from #temp1 

drop table #t 
drop table #temp1 
+0

당신의 솔루션이 트릭을 해주었습니다. – SaiBand

2

사용이 문 :

select t1.User_Id, t1.Diff_Time, 
    isnull(count(t2.User_Id), 0) + 1 as Session_Number 
from @table t1 
left join @table t2 
    on t1.User_Id = t2.User_Id 
    and t1.eventTime >= t2.eventTime 
    and t2.Diff_Time > 20 
group by t1.User_Id, t1.Diff_Time, t1.eventTime 
order by t1.User_Id, t1.eventTime 

(실제 테이블 이름으로 @table 교체)

참고 : 나는 테이블의 다섯 번째 행이 Diff_Time 열에서 값 21이 있다고 가정 @AaronBertrand가 의견에 지적한 바와 같이 질문에 오타가 있습니다.

+0

@AaronBertrand 당신이 지적했듯이 오타라고 생각했습니다. 필자는 다섯 번째 행에 값 '21'이있는 테이블에서이를 테스트했습니다. – GolfWolf

+0

OP는 방금 첫 번째 표의 20 개는 오타가되었으며 21 개가되어야한다고 말했습니다. 지금까지 내가 알 수있는 바로는 올바른 결과를 제공합니다. – kevev22

관련 문제