【问题标题】:Excel - calculating durations of time data spread across multiple rowsExcel - 计算跨多行的数据持续时间
【发布时间】:2010-09-24 20:08:23
【问题描述】:

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

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

我的数据的简化示例如下:

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 作为行,时间作为数据。我可以更改时间数据的字段设置以返回分组值,例如计数或最大值,但我很难看到如何设置它以显示每个 ID 的 max(time) - min(time),因此我为什么正在考虑使用 SQL。如果有人能指出我遗漏的任何明显内容,我将不胜感激。

按照 Hobbo 的建议,我现在使用了一个数据透视表,其中 TransID 作为行,并两次添加了 Time 作为数据。在第一个的 Time to Max 和第二个的 Min 设置字段设置后,可以在数据透视表之外添加一个公式来计算差异。我在这里忽略的一件事是,可以多次将相同的值添加到数据部分!

一个后续问题是我添加的公式是 =GETPIVOTDATA("Max of Time",$A$4,"ID",1)-GETPIVOTDATA("Min of Time",$A$4, "ID",1),复制和粘贴时不会增加。解决方案是使用数据透视表工具栏关闭 GETPIVOTDATA 公式,或者在选择公式中的单元格时不单击数据透视表,而是键入单元格引用(例如 =H4-G4)

【问题讨论】:

    标签: excel pivot-table


    【解决方案1】:

    在您的公式“GETPIVOTDATA("Max of Time, $A$4, "ID", 1) - GETPIVOTDATA("Max of Time, $A$4, "ID", 1)' 中,单元格引用在符号“$”。例如 4 澳元。当单元格引用具有 $ 符号并且您将公式复制到其他单元格时,引用单元格不会自动更新。因此你得到相同的类型。

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

    "GETPIVOTDATA("最大时间, A4, "ID", 1) - GETPIVOTDATA("最大时间, A4, "ID", 1)"。

    谢谢。

    【讨论】:

      【解决方案2】:

      要添加到 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 中的保留字,会导致查询困难。这现在适用于一个非常简单的测试。

      【讨论】:

      • 好主意,我喜欢。它适用于简单查询 - 例如“SELECT TransID FROM [Sheet1$] GROUP BY TransID”,但不适用于相关查询:“SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration FROM [Sheet1$] 按 TransID 分组”。我假设与时间格式有关,将进行更多调查......
      • 感谢您的帮助 - 我认为这将得到我的答案,尽管数据透视表避免了任何编码并且已启动并运行,所以这次我将使用它。用 Excel 了解 ADO 很方便 - 想我将来可能会找到它的用途!
      【解决方案3】:

      您在数据透视表方面处于正确的位置。拖入 TransID 作为行字段,然后拖入两个 Time 副本作为数据透视表中的数据字段;右键单击每个并将 Min 指定为一个的汇总函数,将 Max 指定为另一个。在数据透视表的右侧添加一个公式来计算差异。

      alt text http://img296.imageshack.us/img296/5866/pivottableey5.jpg

      "看起来不错,我唯一的问题是我添加的公式是 =GETPIVOTDATA("Max of Time, $A$4, "ID", 1) - GETPIVOTDATA("Max of Time, $ 4 美元,“ID”,1)。当我将其复制到下面的单元格时,1 不会更新为 2、3 等,因此它们都显示相同的时间。- Kris Coverdale "

      使用数据透视表工具栏上的此按钮关闭 GETPIVOTDATA 公式。

      alt text http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg

      【讨论】:

      • 看起来不错,我唯一的问题是我添加的公式是 =GETPIVOTDATA("Max of Time, $A$4, "ID", 1) - GETPIVOTDATA("Max时间,$A$4,“ID”,1)。当我将其复制到下面的单元格时,1 不会更新为 2、3 等,因此它们都显示相同的时间。
      • 嗯 - 我的 Excel (2003) 似乎没有那个按钮。我去看看能不能在别处找到类似的设置
      • 忽略它,想通了 :) 键入单元格引用(例如 =H4-G4),而不是单击单元格以在公式中选择它们。
      • 感谢您的帮助 - 看起来应该可以很好地扩展到我正在处理的实际数据:)
      • 啊..默认情况下该按钮不可见。单击工具栏右侧的小下拉箭头,“添加和删除按钮”->“透视工具栏”->“生成 GetPivotData”
      【解决方案4】:

      在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。

      【讨论】:

        【解决方案5】:

        有时在 Excel 中做某事比重复做某事要容易得多。

        假设您只是想得到一两次答案,然后扔掉电子表格(而不是每晚运行它,或者将它交给其他人运行),我会这样做。

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

        按 TransId 作为主键和 Time 作为辅助键对表进行排序,均升序。 (如果不这样做,以下将不起作用。)

        添加一个名为 Duration 的新列 D,使用类似这样的公式(Excel 公式没有格式化或 cmets;我添加了这些以帮助解释,但需要删除它们):

        =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 列中,但不是您想要的格式。

        选择 A-D 列并复制它们。使用选择性粘贴仅将 复制到新工作表中。

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

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

        仅对具有 TransId 值的行进行排序。

        瞧,这就是您的解决方案!希望您不需要重复此操作!

        附言这是未经测试的

        【讨论】:

        • 这是我认为 Excel 会做的那种解决方案 - 明天我会根据我的真实数据来玩这个;如果我不能让 ADO 查询事情继续下去,这看起来应该做需要做的事情。我需要做大约 10 次,所以可能会有点痛苦 :S 哦 excel...
        【解决方案6】:

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

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

        【讨论】:

        • 如果我确定将其加载到数据库中,我可以这样做。我想知道我是否可以在 Excel 中做到这一点,只是忽略了一些东西。如果没有,那么构建一个小型数据库并导入是明天的任务:)
        • @kibbee,我想你的意思可能是“n”,而不是 mi。
        猜你喜欢
        • 1970-01-01
        • 2018-08-22
        • 2011-07-30
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-06
        相关资源
        最近更新 更多