字段更改时的T-SQL重置行号,包括重复的实例

时间:2017-01-19 15:17:34

标签: sql sql-server sql-server-2008 tsql

我正试图找到一种方法来显示在第二个事件类型发生之前事件类型连续发生了多少次。当我有这个时,我需要在事件类型连续发生6次时显示

为了简化我有一个包含

的'Calls'表
CallID
UserID
Outcome
DateOfCall

从那时起,我有很多UserID个结果,YesNo在不同时间

我需要找到连续6次没有发生的事情

我目前正在使用分区,并且已计算出OutcomeUserID的数量,但我很难在Outcome更改时重置行号第二次UserID

 select  CallID,
        UserID,
        Outcome,
        DateOfCall
        rnk = ROW_NUMBER() OVER (PARTITION BY UserID , outcome ORDER BY DateOfCall ASC)
        from    Calls
        order by UserID, DateOfCall

为UserID提供以下内容

- 19/01/2017 12:00 - Yes - 1 
- 19/01/2017 12:01 - Yes - 2
- 19/01/2017 12:02 - Yes - 3
- 19/01/2017 12:03 - No  - 1
- 19/01/2017 12:04 - No  - 2
- 19/01/2017 12:05 - No  - 3
- 19/01/2017 12:06 - Yes - 4
- 19/01/2017 12:07 - Yes - 5
- 19/01/2017 12:08 - No  - 4
- 19/01/2017 12:09 - No  - 5
- 19/01/2017 12:10 - No  - 6

正如您所看到的那样,12:10的呼叫将触发,因为它是第6个“否”事件,但两次都只发生了3次。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

你可以使用"行号的差异来做你想做的事情"的方法:

select c.*,
       row_number() over (partition by userid, outcome, seqnum_u - seqnum_uo
                          order by dateofcall
                         ) as rnk
from (select c.*,
             row_number() over (partition by userid order by dateofcall) as seqnum_u,
             row_number() over (partition by userid, outcome order by dateofcall) as seqnum_uo
      from Calls c
     ) c
order by UserID, DateOfCall;

这种逻辑在您第一次看到它时很棘手(嘿,甚至可能是第三次或第五次)。我建议您运行内部查询,以便您可以看到差异识别相邻状态值组的原因。然后外部查询中的row_number()更有意义。