计算记录在特定状态下花费的时间

时间:2013-08-31 13:00:12

标签: mysql sql

有人可以帮我完成下一个任务吗?这是一个问题: 我们有一个历史表(记录的状态变化),我们需要计算记录在特定状态下的时间(以天为单位)。这是历史表的结构:

ID| RecordId| CreatedDate         | Field  | OldValue      | NewValue
1 | Record1 | 2013-08-07 09:40:31 | Status | Open          | Awaiting Info
2 | Record1 | 2013-08-08 07:30:20 | Status | Awaiting Info | Open
3 | Record1 | 2013-08-14 01:45:42 | Status | Open          | Resolved

因此,我们需要创建如下表:

Status   | TimeSpentInStatusInDays
Open     |     2
Awaiting |     3
Resolved |     1

值是例如(它们没有连接到实际数据集)但结构完全相同,我们需要跟踪四种不同的状态。

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要获得下一个日期然后采取差异。 MySQL没有lead()函数,您可以使用相关子查询。结果如下:

select h.status,
       sum(datediff(nextCreatedDate, CreatedDate)) as TotalDays
from (select h.*,
             (select h2.CreatedDate
              from history h2
              where h2.CreatedDate > h.CreatedDate and
                    h2.RecordID = h.RecordId
              order by h2.CreatedDate
              limit 1
             ) as nextCreatedDate
      from history h
     ) h
group by h.status;

这也将在history(RecordId, CreatedDate)的索引上获得不错的表现。

编辑:

另一种方法是使用变量:

select h.status,
       sum(datediff(nextCreatedDate, CreatedDate)) as TotalDays
from (select h.*, @nextDate as nextCreatedDate,
             @nextdate := if(@RecordId = @nextRecordId, CreatedDate, NULL),
             @nextRecordId := RecordId,
      from history h cross join
           (select @nextdate := NULL, @nextRecordId := NULL) const
      order by RecordId, CreatedDate desc
     ) h
group by h.status;

我真的不喜欢这种方法,因为它取决于子查询中变量的参数的估值顺序。 MySQL不保证订购。

答案 1 :(得分:0)

您可以使用datediff功能。它返回天数差异。假设您必须计算记录ID 1处于打开状态时的天数,查询将是:

select DateDiff((select Created_Date from histtable where RecordId='1' and   
Status='Awaiting'), (select Created_Date from histtable where RecordId='1' and 
Status='Open')); 

等待是打开状态后的下一个状态,因此从打开状态日期减去它将计算记录处于打开状态的天数。

同样,如果使用某种公式,您可以获得特定记录的不同状态的天数。

记录解决的天数=(解决日期 - 打开日期),如果我清楚地理解你的问题。