【问题标题】:Check for sequence of rows检查行的顺序
【发布时间】:2017-12-31 06:44:55
【问题描述】:

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

-----------------------------------------
| 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 更改为 finished 或直接从 TBQ 更改为关闭

我认为这应该可以通过递归 CTE 实现,但事情变得更加复杂,因为 commentid 不是一张票的直接序列,而是所有票的直接序列。此外,单个工单的状态更改之间可能有相当多的行。

对于上面的示例表,查询应返回“1”,因为票证 1337 是唯一将状态直接从 TBQ 更改为 closed

的票证

我该怎么做?

【问题讨论】:

  • 请发表输出也无法理解的问题
  • 这些状态变化如何发生有什么规则吗?例如。多个 TBQ*/*TBP 后跟单个 closedfinished?
  • 1337 从 TBQ 变为 TBQ。这不是问题吗?
  • @SalmanA 评论不必更改票证状态

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


【解决方案1】:

您真正想要的是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)(如果给定票证可能发生多次)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多