0

我有一个存储票状态更改的表。一些门票在关闭后重新打开。并且在某些情况下(下面的示例)重新打开了几次。

Ticket  SEQUENCE    NEWVALUE    OLDVALUE        TIMESTAMP
5879    15870       REQUEST     NULL        2015-06-10 12:13:28.000
5879    16256       Pending     REQUEST     2015-06-11 14:26:38.000
5879    21642       Open        Pending     2015-07-02 13:32:47.000
5879    21943       Pending     Open        2015-07-06 09:55:37.000
5879    23195       Open        Pending     2015-07-09 15:00:47.000
5879    24917       Pending     Open        2015-07-17 15:09:28.000
5879    25903       Closed      Pending     2015-07-22 11:13:03.000
5879    25940       Open        Closed      2015-07-22 12:56:05.000
5879    25972       Pending     Open        2015-07-22 13:54:30.000
5879    25996       Closed      Pending     2015-07-22 14:31:05.000
5879    26484       Pending     Closed      2015-07-24 14:43:28.000
5879    26776       Closed      Pending     2015-07-27 11:34:00.000

我正在尝试确定上次关闭票证的时间。但我什至不知道如何开始这个查询。有人可以提供线索吗?非常感谢!

我试图得到的最终结果如下所示:

Date        Tickets Submitted   Tickets Closed
2015-06-01      123                 44
2015-06-02      125                 45
2015-06-03      147                 51
2015-06-04      190                 58
2015-06-05      132                 38
2015-06-06      93                  28
2015-06-07      126                 30
2015-06-08      167                 50

我目前的查询是:

SELECT CAST(SUBMITDATE as date) as 'Date'

,COUNT(*) as [Tickets Submitted]
,SUM(CASE WHEN NEWVALUE = 'Closed' THEN 1 ELSE 0 END) as [Tickets Closed]

FROM dbo.MasterTable
FULL OUTER JOIN FIELDHISTORY
ON MasterTable.Ticket = FIELDHISTORY.Ticket

    WHERE SUBMITDATE >= '2015-06-01'
        AND SUBMITDATE < '2015-06-08'

GROUP BY CAST(SUBMITDATE as date)
ORDER BY CAST(SUBMITDATE as date)

此查询的问题在于它没有显示在该特定日期关闭了多少票。它仅显示在特定日期打开的票证池中关闭的票证数量。换句话说,从上面的示例中,在 2015 年 6 月 1 日,创建了 123 个工单,其中 44 个工单目前已关闭。如果有人要关闭 6 月 1 日创建的另一张工单,则 44 个已关闭工单的数字可能会发生变化。

希望这不会太混乱!=D

4

3 回答 3

1

假设:

为了将工单视为已关闭,最后一个状态必须为“已关闭”,并且工单不能从“已关闭”状态开始。你可以试试下面的 SQL。

DECLARE @Ticket int = 5879;

SELECT [Timestamp] FROM [Table_Name]
WHERE Ticket=@Ticket AND NewValue = 'Closed'  
AND [Timestamp] = (SELECT Max([Timestamp]) FROM [Table_Name] WHERE Ticket=@Ticket)

[Table_Name] 将替换为您的表名。

于 2015-07-31T20:00:40.287 回答
1

根据您的更新,我相信这就是您所追求的。

您可以使用row_number窗口函数按票证/日期(我称之为 this rid)给出行号。然后你也可以count按票/日期进行(我称之为tdc)。

这是mycte在我将其更改为 do countsand之前的输出sums

actdt       ticket  sequence    newvalue    oldvalue    rid tdc
2015-06-10  5879    15870       REQUEST     NULL        1   1
2015-06-11  5879    16256       Pending     REQUEST     1   1
2015-07-02  5879    21642       Open        Pending     1   1
2015-07-06  5879    21943       Pending     Open        1   1
2015-07-09  5879    23195       Open        Pending     1   1
2015-07-17  5879    24917       Pending     Open        1   1
2015-07-22  5879    25903       Closed      Pending     1   4
2015-07-22  5879    25940       Open        Closed      2   4
2015-07-22  5879    25972       Pending     Open        3   4
2015-07-22  5879    25996       Closed      Pending     4   4
2015-07-24  5879    26484       Pending     Closed      1   1
2015-07-27  5879    26776       Closed      Pending     1   1

根据您的信息,sequence=25996并且sequence=26776是唯一可以算作实际关闭的事件,因为它是当天的最后一个事件。注意这里,rid=tdc

如果这些值匹配是当天的最后一个事件,则是否应在同一日期重新打开/处理票证(您也可以对 inverse 执行相同操作row_number,但这为检查其他条件提供了更多的灵活性)。因此,您可以使用这两个新列来评估项目是否计为已关闭,但由于它是有条件的count,因此您必须改为sum0/1。

输出:

actdt       submitted   closed
2015-06-10  1           0
2015-06-11  1           0
2015-07-02  1           0
2015-07-06  1           0
2015-07-09  1           0
2015-07-17  1           0
2015-07-22  4           1
2015-07-24  1           0
2015-07-27  1           1

完整代码:

create table mydata (ticket int, sequence int, newvalue varchar(25), oldvalue varchar(25), [timestamp] datetime)
insert into mydata
select 5879,15870,'REQUEST','NULL','2015-06-10 12:13:28.000' union
select 5879,16256,'Pending','REQUEST','2015-06-11 14:26:38.000' union
select 5879,21642,'Open','Pending','2015-07-02 13:32:47.000' union
select 5879,21943,'Pending','Open','2015-07-06 09:55:37.000' union
select 5879,23195,'Open','Pending','2015-07-09 15:00:47.000' union
select 5879,24917,'Pending','Open','2015-07-17 15:09:28.000' union
select 5879,25903,'Closed','Pending','2015-07-22 11:13:03.000' union
select 5879,25940,'Open','Closed','2015-07-22 12:56:05.000' union
select 5879,25972,'Pending','Open','2015-07-22 13:54:30.000' union
select 5879,25996,'Closed','Pending','2015-07-22 14:31:05.000' union
select 5879,26484,'Pending','Closed','2015-07-24 14:43:28.000' union
select 5879,26776,'Closed','Pending','2015-07-27 11:34:00.000'

; with cte (actdt,ticket,sequence,newvalue,oldvalue,rid,tdc)
as
(
   select convert(date,[timestamp]), 
          ticket,
          sequence,
          newvalue,
          oldvalue,
          row_number() over(partition by ticket,convert(date,[timestamp]) order by sequence) as rid,
          count(2) over(partition by ticket,convert(date,[timestamp])) as tdc
   from mydata
)

select actdt,
       count(distinct sequence) as submitted,
       sum(case when newvalue='closed' and rid=tdc then 1 else 0 end) as closed
from cte
group by actdt

如果我遗漏了什么,请告诉我,我可以根据需要进行更新。

SQLFiddle

于 2015-08-01T04:14:57.290 回答
0

从 TABLE_NAME 中选择 TIMESTAMP,其中 NEWVALUE 类似于 'Closed' 或 OLDVALUE 类似于 'Closed'

于 2015-07-31T19:34:39.237 回答