每张票的每个状态的跟踪时间? (Jira/MySQL)

Tracking time in each status per ticket? (Jira/MySQL)

所以我目前正在使用 Jira 和 Domo 为我们的团队创建仪表板。

目前我想显示每张票在每个状态下花费的时间。

例如我有一个这样的table。

 
  |date      |From       | To                 |Ticket ID
  |01/01/21  |Open       |In progress         |1
  |01/03/21  |In progress|In review           |1
  |01/10/21  |In Review  |Done                |1
  |01/15/21  |Done       |Resolved            |1
  |01/01/21  |Open       |In progress         |2
  |01/03/21  |In progress|In review           |2
  |01/10/21  |In Review  |Done                |2
  |01/15/21  |Done       |Resolved            |2

有了这个,我希望能够看到每张票在每个状态下花费了多长时间。

一张工单在完成之前可以返回到一个状态多次。

我真的不知道从哪里开始 mysql 查询开始。 有没有简单的查询可以做到这一点?

大致如下: 样本数据

  create table ticket (
    dated date,
    from_state varchar(10),
    to_state varchar(10),
    ticket_id int
  );
  
  insert into ticket 
  values( '2021-01-01', 'open', 'prog', 1);
  
  insert into ticket 
  values( '2021-01-04', 'prog', 'rev', 1);
  
  insert into ticket 
  values( '2021-01-07', 'rev', 'done', 1);
  
  insert into ticket 
  values( '2021-01-03', 'open', 'prog', 2);
        
  insert into ticket 
  values( '2021-01-04', 'prog', 'rev', 2);
  
  insert into ticket 
  values( '2021-01-04', 'rev', 'prog', 2);
        
  insert into ticket 
  values( '2021-01-10', 'prog', 'done', 2);

查询:

with partitioned as (
    select 
      row_number() over(partition by ticket_id order by dated) rn, 
      ticket_id, from_state state, dated start_date 
    from ticket
),
date_range as (
      select 
        start_state.*, 
        end_state.start_date as end_date
      from partitioned start_state left join partitioned end_state on 
      start_state.ticket_id = end_state.ticket_id and start_state.rn = end_state.rn -1 
),
days_in_state as (
    select ticket_id, state, datediff(end_date, start_date) as days 
    from date_range
)
select ticket_id, state, sum(days)  days_in_state
from days_in_state
group by 1,2 
order by 1,2

第一个查询部分 'partitioned' 使用窗口函数对每张票的数据进行分组。

第二部分使用自连接link每个州的一张票到下一个州的同一张票(使用第一步中的行号)

第三部分计算每个状态的天数(如果工单多次转换到同一个状态,该状态将有多个行)

最终计算出该票在每个州的总计

https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html