Excel – 计算跨多行的时间数据的持续时间

我有一个电子表格,其中包含多个事务的数据集,每个事务由子步骤组成,每个子步骤都具有发生的时间。 可以有一个可变的数量和顺序的步骤。

我想找出每笔交易的持续时间。 如果我可以在Excel中做到这一点,那么很好,因为它已经是这种格式。 如果在Excel中没有直接的方法来做到这一点,我会加载到数据库中,并用SQL进行分析。 如果有一个Excel的方式,这将节省几个小时的设置,虽然:)

我的数据简单例子如下:

TransID,子步,时间
1,步骤A,15:00:00
1,B步15:01:00
1,步骤C,15:02:00
2,步骤B,15:3:00
2,步骤C,15:04:00
2,步骤E,15:05:00
2,F,15:06:00
3,步骤C,15:07:00
3,D,15:08:00
等等

我想要产生一个结果集如下:

TransID,持续时间
1,00:02:00
2,00:03:00
3,00:01:00
等等

我最初的尝试是用一个额外的列与公式减去结束时间从开始时间,但没有重复的步骤,或相同的开始和结束步骤,我很难看到这个公式如何工作。

我也试着创build一个数据透视表基于这个数据与ID作为行和时间作为数据。 我可以更改时间数据的字段设置,以返回分组值(如count或max),但是我正努力想知道如何设置这个值来显示每个ID的max(time) – min(time),所以我为什么考虑前往SQL。 如果有人能指出我很想念的东西,我会非常感激。

正如Hobbo所build议的那样,我现在已经使用了TransID作为行的数据透视表,并且两次添加了Time作为数据。 在第一个时间到最大值和第二个最小值上设置字段设置后,可以在数据透视表之外添加一个公式来计算差异。 我在这里忽略的一件事是,同一个值可以被添加到数据部分不止一次!

后续问题是,我添加的公式是格式= GETPIVOTDATA(“最大时间”,$ A $ 4,“ID”,1)-GETPIVOTDATA(“最小时间”,$ A $ 4,“ID” ,1),然后在复制和粘贴时不增加。 解决方法是使用数据透视表工具栏closuresGETPIVOTDATA公式,或者在公式中select单元格时单击数据透视表,而不是键入单元格引用(例如= H4-G4)

你在数据透视表的右边。 在TransID中作为行字段拖动,然后拖动两个Time作为数据透视表中的数据字段; 右键单击每一个,并将Min指定为一个的汇总函数,将另一个指定为Max。 在数据透视表的右侧添加一个公式来计算差异。

替代文字http://img296.imageshack.us/img296/5866/pivottableey5.jpg

“看起来不错,我唯一的问题是,我添加的公式是格式= GETPIVOTDATA(”最大时间,$ A $ 4,“ID”,1) – GETPIVOTDATA(“最大时间,$ A $ 4, “ID”,1)。当我把它复制到下面的单元格时,1不会更新到2,3等,所以它们都显示相同的时间 – Kris Coverdale“

使用数据透视表工具栏上的此button可以closuresGETPIVOTDATA公式。

替代文字http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg

在您的公式“GETPIVOTDATA(”最大时间,$ A $ 4,“ID”,1) – GETPIVOTDATA(“最大时间,$ A $ 4,”ID“,1)”单元格引用在符号“$ ”。 例如$ A $ 4。 当具有$符号的单元格引用将公式复制到其他单元格时,引用单元格不会自动更新。 因此你得到相同的types。

也许你修改公式如下,然后将公式复制到其他单元格。 公式应该是这样的:

“GETPIVOTDATA(”Max of Time,A4,“ID”,1) – GETPIVOTDATA(“Max of Time,A4,”ID“,1)”。

谢谢。

也许像这样的查询一样简单。

SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration FROM MyTable GROUP BY TrandID 

在excel中:

  ABC 1 1, step A, 15:00:00 2 1, step B, 15:01:00 3 1, step C, 15:02:00 4 2, step B, 15:03:00 5 2, step C, 15:04:00 6 2, step E, 15:05:00 7 2, step F, 15:06:00 8 3, step C, 15:07:00 9 3, step D, 15:08:00 11 1, =max(if($A$1:$A$9=$A11,$C$1:$C$9,"")-min(if($A$1:$A$9=$A11,$C$1:$C$9,"") 12 2, =max(if($A$1:$A$9=$A12,$C$1:$C$9,"")-min(if($A$1:$A$9=$A12,$C$1:$C$9,"") 

注意:公式是数组函数,所以在编辑它们后按ctrl-shift-enter。

要添加到Kibbee的文章,请参阅评论,您可以使用ADO与Excel:

 'From: http://support.microsoft.com/kb/246335 ' strFile = Workbooks(1).FullName strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT TransID, DateDiff('n', Min([MyTime]),Max([MyTime])) AS Duration " _ & "FROM [Sheet1$] GROUP BY TransID" rs.Open strSQL, cn 'Write out to another sheet ' Worksheets(2).Cells(2, 1).CopyFromRecordset rs 

编辑:我更正了原始文章中的一些错误,并将时间列的名称更改为MyTime。 时间是SQL中的一个保留字,会造成查询困难。 这现在在一个非常简单的testing。

有时候,在Excel中做事可能比做重复的事情要容易得多。

假设你只是试图得到答案一两次,然后扔掉电子表格(而不是每天晚上运行它,或给别人跑),这是我该怎么做的。

我假设你的原始数据在A,B和C列,标题在第1行,数据从第2行开始。

将TransId作为主键sorting,Time作为辅助键,两者都是递增的。 (如果没有完成,以下内容将不起作用。)

用一个像这样的公式(Excel公式没有格式化或注释;我已经添加了这些来帮助解释,但需要删除它们)添加一个标题为“持续时间”的新列D:

 =IF(B2=B3, // if this row's TransId is the same as the next one "", // leave this field blank C3- // else find the difference between the last timestamp and... VLOOKUP( // look for the first value A2, // matching this TransId A:C, // within the entire table, 3) // Return the value in the third column - ie timestamp ) 

现在你想要的数据在D列,但不是你想要的格式。

select列AD并复制它们。 使用select性粘贴将只复制到一个新的工作表中。

删除新工作表中的B列和C列,所以剩下的就是TransID和Duration。

按持续时间sorting,使所有行的值彼此相邻。

通过TransId对仅包含值的行进行sorting。

瞧,有你的解决scheme! 希望你不需要重复这个!

ps这是未经testing的