[英]Excel - calculating durations of time data spread across multiple rows
我有一个电子表格,其中包含许多事务的数据集,每个事务都由子步骤组成,每个子步骤都有发生的时间。 步数和顺序可以是可变的。
我想找到每笔交易的时间。 如果我可以在Excel中执行此操作,那就太好了,因为它已经采用了这种格式。 如果没有在Excel中执行此操作的简便方法,则将其加载到数据库中并使用SQL进行分析。 如果有解决此问题的方法,则可以节省几个小时的设置:)
我的数据的简化示例如下:
TransID,子步骤,时间
1,步骤A,15:00:00
1,步骤B,15:01:00
1,步骤C,15:02:00
2,步骤B,15:03: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
等等
我最初的尝试是使用额外的列,其中包含一个从开始时间减去结束时间的公式,但是没有重复的步骤数,或者没有相同的开始和结束步骤,因此我很难看到此公式的工作原理。
我还尝试根据此数据创建数据透视表,其中ID为行,Time为数据。 我可以更改时间数据上的字段设置以返回诸如count或max之类的分组值,但是正在努力查看如何将其设置为显示每个ID的max(time)-min(time),因此为什么考虑前往SQL。 如果有人能指出我所缺少的明显内容,我将不胜感激。
正如Hobbo所建议的那样,我现在使用了一个以TransID作为行的数据透视表,并两次添加了Time作为数据。 在第一个上将“时间设置为最大”和第二个上“最小”设置为字段设置之后,可以在数据透视表的外部添加一个公式来计算差异。 我在这里忽略的一件事是,相同的值可以多次添加到数据部分!
接下来的问题是我添加的公式的格式为= GETPIVOTDATA(“时间的最大值”,$ A $ 4,“ ID”,1)-GETPIVOTDATA(“时间的最小值”,$ A $ 4,“ ID” ,1),然后在复制和粘贴时不会递增。 解决方案是使用数据透视表工具栏关闭GETPIVOTDATA公式,或者在选择公式中的单元格时不要单击数据透视表,而是键入单元格引用(例如= H4-G4)
在您的公式“ GETPIVOTDATA(“最大时间,$ A $ 4,” ID“,1)-GETPIVOTDATA(”最大时间,$ A $ 4,“ ID”,1)'中,单元格引用在符号“ $”之间寻址”。 例如,$ A $ 4。 当单元格引用带有$符号并且您将公式复制到其他单元格时,引用单元格不会自动更新。 因此,您得到相同的类型。
也许您可以如下修改公式,然后将公式复制到其他单元格。 公式应类似于:
“ GETPIVOTDATA(”最大时间,A4,“ ID”,1)-GETPIVOTDATA(“最大时间,A4,” ID“,1)”。
谢谢。
也许像这样的查询一样简单。
SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration
FROM MyTable
GROUP BY TrandID
要添加到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中的保留字,会导致查询困难。 现在,这适用于非常简单的测试。
您在数据透视表的右边。 将TransID作为行字段拖入,然后将两个时间副本作为数据字段拖入数据透视表; 右键单击每个,然后将Min指定为一个汇总函数,将Max指定为另一个。 在数据透视表的右侧添加公式以计算差异。
替代文字http://img296.imageshack.us/img296/5866/pivottableey5.jpg
“看起来不错,我唯一的问题是我添加的公式的格式为= GETPIVOTDATA(“ Max of Time,$ A $ 4,” ID“,1)-GETPIVOTDATA(” Max of Time,$ A $ 4, “ ID”,1)。当我将其复制到下面的单元格时,1不会更新为2,3等,因此它们都显示相同的时间。– Kris Coverdale“
使用数据透视表工具栏上的此按钮可以关闭GETPIVOTDATA公式。
替代文字http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg
在Excel中:
A B C
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。
有时,在Excel中执行一次操作要比重复执行操作容易得多。
假设您只是尝试获得答案一次或两次,然后丢弃电子表格(而不是每天晚上运行它,或将其交给其他人运行),那么我将按照以下方法进行操作。
我假设您的原始数据在A,B和C列中,标题在第1行中,数据从第2行开始。
按TransId排序表作为主键,按Time排序作为辅助键,两者均递增。 (如果不执行以下操作,则将不起作用。)
添加一个新列D,标题为Duration,其公式如下所示(Excel公式未设置格式或注释;我添加了这些内容以进行解释,但需要将其删除):
=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 - i.e. timestamp
)
现在,所需的数据在D列中,但不在所需的格式中。
选择列AD并将其复制。 使用选择性粘贴仅将值复制到新的工作表中。
删除新工作表中的B列和C列,因此剩下的就是TransID和Duration。
按持续时间排序,以使所有带有值的行彼此相邻。
仅按TransId对具有值的行进行排序。
瞧,有您的解决方案! 希望您不需要重复此操作!
ps这未经测试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.