Gly*_*lyn 1 sql t-sql sql-server sql-server-2008
我试图找到一种方法来显示事件类型在发生第二个事件类型之前连续发生了多少次。当我需要显示事件类型连续发生6次时
为简化起见,我有一个“通话”表,其中包含
CallID
UserID
Outcome
DateOfCall
Run Code Online (Sandbox Code Playgroud)
从那里,我有许多UserIDs的结果一样Yes或No在不同的时间
我需要找出连续六次没有发生的时间
我目前正在使用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
Run Code Online (Sandbox Code Playgroud)
给我以下的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
Run Code Online (Sandbox Code Playgroud)
如您所见,呼叫12:10将触发,因为它是第六次“否”事件,但是两次均连续发生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;
Run Code Online (Sandbox Code Playgroud)
第一次看到此逻辑时比较棘手(嘿,也许也是第三或第五次)。我建议您运行内部查询,以便可以看到为什么差异标识相邻状态值的组。然后,row_number()在外部查询中更有意义。
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |