2012-02-23 9 views
0

私は列UserID、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

これらはテーブル内の唯一の2列ですか?私はあなたが注文を指示するために何かを必要とするだろうと思う。クエリでは、5と5が10より前に発生する前に0が起きたことを知ることはできません。 –

+0

@Aaron:私が持っている他の列はeventTime..Nope 21はtypoではありません... 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を置き換え)

注:私はあなたのテーブルの5行目はDiff_Time列に値21を持っていることを前提としてい@AaronBertrandがコメントに指摘したように、質問にはタイプミスがあります。

+0

@AaronBertrandあなたが指摘したように、私はそれが誤字だと思っていました。私はこれを5列目の値が「21」のテーブルでテストしました。 – GolfWolf

+0

OPはちょうど最初のテーブルの20がタイプミスであり、21であったはずであるとコメントしました。 – kevev22

関連する問題