我有一张来自票务系统的表,其格式如下(仅显示两张示例票据的行):
-----------------------------------------
| commentid | ticketid | ticketstatus |
|-----------|------------|--------------|
| 105 | 1337 | TBQ |
| 109 | 4242 | TBP |
| 118 | 1337 | TBQ |
| 121 | 4242 | closed |
| 125 | 1337 | finished |
| 176 | 1337 | closed |
-----------------------------------------
其中ticketid
是故障单的唯一ID,commentid
为每个新评论递增的索引,ticketstatus
是故障单的状态。
现在,我想计算门票的数量,其中状态直接从 TBQ 更改为已完成或直接从 TBQ 更改为关闭
我认为这应该可以通过递归CTE实现,但是事情变得更复杂,因为commentid
不是一张票的直接序列,而是所有票。此外,单个故障单的状态更改之间可能会有很多行。
对于上面的示例表,查询应该返回“1”,因为票证1337是唯一直接从 TBQ 更改状态到关闭
的票证我该怎么做?
答案 0 :(得分:3)
您真正想要的是lag()
,但这在SQL Server 2008中不可用。您可以改为使用apply
:
select c.*, cprev.*
from comments c cross apply
(select top 1 cprev.*
from comments cprev
where cprev.ticketid = c.ticketid and
cprev.commentid < c.commentid
order by cprev.commentid desc
) cprev
where cprev.ticketstatus = 'TBQ' and
c.ticketstatus in ('finished', 'closed');
如果您想要计算此类票证,请使用select count(*)
或select count(distinct c.ticketid)
(如果给定票证的次数可能超过一次)。