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

あなたの更新に基づいて、これがあなたが求めているものだと思います.

ウィンドウ関数を使用して、row_numberチケット/日付で行番号を指定できます(私はこれを呼び出しましたrid)。count次に、チケット/日付でも行うことができます(私はこれを呼び出しましたtdc)。

doおよびmycteに変更する前の出力は次のとおりです。countssums

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=25996sequence=26776ここで注意してくださいrid=tdc

これらの値が一致する場所は、その日の最後のイベントであり、チケットが同じ日に再オープン/処理された場合です ( inverserow_numberで同じことを行うこともできますが、これにより、他の条件を確認するための柔軟性が少し高くなります)。したがって、これらの 2 つの新しい列を使用して、アイテムがクローズ済みとしてカウントされるかどうかを評価できますが、条件付きであるため、代わりに 0/1 を使用するcount必要があります。sum

出力:

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

何か見逃した場合はお知らせください。必要に応じて更新できます。

SQLフィドル

于 2015-08-01T04:14:57.290 に答える
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 に答える
0

TABLE_NAME から TIMESTAMP を選択します。NEWVALUE は「Closed」など、OLDVALUE は「Closed」などです。

于 2015-07-31T19:34:39.237 に答える