有人可以帮我完成下一个任务吗?这是一个问题: 我们有一个历史表(记录的状态变化),我们需要计算记录在特定状态下的时间(以天为单位)。这是历史表的结构:
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 :(得分: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'));
等待是打开状态后的下一个状态,因此从打开状态日期减去它将计算记录处于打开状态的天数。
同样,如果使用某种公式,您可以获得特定记录的不同状态的天数。
记录解决的天数=(解决日期 - 打开日期),如果我清楚地理解你的问题。