当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《字段更改(包括重复的实例)时,T-SQL重置行号》经验,为你挑选了1个好方法。

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

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

CallID
UserID
Outcome
DateOfCall

从那里,我有许多UserIDs的结果一样YesNo在不同的时间

我需要找出连续六次没有发生的时间

我目前正在使用Partition,并且已经计算出Outcomes 的数量UserID,但是当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将触发,因为它是第六次“否”事件,但是两次均连续发生3次。

任何帮助将不胜感激



1> Gordon Linof..:

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

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()在外部查询中更有意义。

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有