2017-07-25 58 views
1

的顺序我有一个售票系统的表,被格式化是这样的(仅两个样品票行所示):检查行

----------------------------------------- 
| 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

请发布输出也无法理解问题 – mohan111

+0

有没有任何规则如何发生这些状态变化?例如。多个* TBQ */* TBP *后跟一个*封闭*或*完成*? – dnoeth

+0

1337从TBQ变为TBQ。这不是问题吗? –

回答

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)(如果这对于给定的票证可能发生多次)。

+0

这是完美的,非常感谢你! – Niek