2013-08-31 38 views
0

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

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 

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

任何帮助将不胜感激。谢谢。

+0

您是直接使用MySql,还是使用PHP之类的语言? – TecBrat

+0

我们直接使用MySQL,谢谢你的回答。我会尝试的。 – Andrew

+0

如何等待3天? – user1502952

回答

0

您需要获取下一个日期,然后才能发现差异。 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不保证排序。

+0

我试过这一个,但它似乎像查询需要永远执行。我等了半个小时,仍然没有结束。有什么想法如何优化?按照您的建议,我在RecordId和CreatedDate上添加了索引。我们在历史表中有超过百万条记录,并且它不断增长。您的解决方案就是我们所需要的,但只有在试图通过所有超过百万条记录时,才能对特定RecordId进行测试。 – Andrew

+0

@Andrew。 。 。你添加了两个索引还是一个索引?我特别说了一个关于'history(RecordId,CreatedDate)'的综合索引。 –

+0

Gordon,非常感谢你的回答,我自己想出了合成索引,应该马上完成它...我用你的第一个解决方案,它似乎工作正常。 – Andrew

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')); 

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

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

记录需要解决的天数=(解决日期 - 打开日期),如果我明白你的问题。

相关问题