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

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

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

为了简化,我有一个“通话”表,其中包含

CallID
UserID
Outcome
DateOfCall

从那里我有许多 UserID,在不同时间结果为 YesNo

我需要找出什么时候 No 连续发生 6 次

我目前正在使用 Partition 并让它计算每个 UserIDOutcome 的数量,但是当 >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 个。

任何帮助将不胜感激

最佳答案

您可以使用“行号差异”方法做您想做的事:

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() 就更有意义了。

关于sql - T-SQL 在字段更改时重置行号,包括重复实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745368/

相关文章:

mysql - 如何在不禁用 ONLY_FULL_GROUP_BY 的情况下获得相同的结果

mysql - MySQL 中的左连接没有给我预期的结果

sql - 同时使用 RANK 和 COUNT(DISTINCT) 聚合

SQL Server 事务 (ID) 死锁

sql - 是否可以使用 SQL 通过表达式引擎表达式创建索引?

MySQL嵌套连接

sql - 选择今天的日期作为默认日期

mysql - 具有前 x 条记录和完整记录计数的 SQL 查询

java - 20 个模拟用户的 Hibernate 死锁

sql - 计算一列中另一列中有多个值的不同记录