繁体   English   中英

Excel-计算分布在多行中的时间数据的持续时间

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM