检查行的顺序

时间:2017-07-25 11:14:43

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

我有一张来自票务系统的表,其格式如下(仅显示两张示例票据的行):

-----------------------------------------
| 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 更改状态到关闭

的票证

我该怎么做?

1 个答案:

答案 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)(如果给定票证的次数可能超过一次)。