SQL SERVER генерирует номер строки на основе критериев - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть таблица, в которой есть столбцы UserID, DIFFTIME. когда я выбираю эти столбцы из таблицы, я также хочу иметь производный столбец, который: Если DiffTime> 20, я хочу увеличить счетчик для идентификатора пользователя.

Например, если в таблице:

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

Мне нужен набор результатов, похожий на этот:

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

Как мне это сделать.

Идеи и предложения очень ценятся!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Используйте это утверждение:

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 реальным именем таблицы)

Примечание: Я предполагаю, что пятая строка вашей таблицы имеет значение 21 в столбце Diff_Time, и в вопросе есть опечатка, как @AaronBertrand указал в комментариях

1 голос
/ 23 февраля 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...