Excel - вычисление продолжительности разброса временных данных по нескольким строкам - PullRequest
2 голосов
/ 02 декабря 2008

У меня есть электронная таблица с набором данных о количестве транзакций, каждая из которых состоит из подэтапов, каждая из которых имеет время, когда это произошло. Может быть переменное число и порядок шагов.

Я бы хотел узнать продолжительность каждой транзакции. Если я могу сделать это в Excel, то отлично, так как он уже в этом формате. Если в Excel нет простого способа сделать это, я загружу его в базу данных и проведу анализ с помощью SQL. Если есть способ обойти Excel, то это сэкономит несколько часов:)

Упрощенный пример моих данных выглядит следующим образом:

TransID, подшаг, время
1, шаг А, 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, но я изо всех сил пытаюсь понять, как это можно настроить, чтобы показывать max (время) - min (время) для каждого идентификатора, поэтому я думать о направлении к SQL. Если кто-то может указать на что-то очевидное, что я скучаю, я был бы очень благодарен.

Как предложил Хоббо, я теперь использовал сводную таблицу с TransID в качестве строк и дважды добавил Time в качестве данных. После установки параметров поля в поле «Макс. Время» для первого и «Мин» во втором можно добавить формулу непосредственно за пределами сводной таблицы для расчета различий. Одна вещь, которую я здесь упустил, это то, что одно и то же значение может быть добавлено в раздел данных более одного раза!

Следующая проблема заключалась в том, что формула, которую я добавляю, имеет вид = GETPIVOTDATA («Макс. Времени», $ A $ 4, «ID», 1) -GETPIVOTDATA («Мин. Времени», $ A $ 4, «ID», 1), который не увеличивается при копировании и вставке. Решением этой проблемы является либо использование панели инструментов сводной таблицы для отключения формул GETPIVOTDATA, либо вместо нажатия на сводную таблицу при выборе ячеек в формуле, вместо этого введите ссылки на ячейки (например, = H4-G4)

Ответы [ 6 ]

2 голосов
/ 23 ноября 2010

В вашей формуле "GETPIVOTDATA (" Макс. Времени, $ A $ 4, "ID", 1) - GETPIVOTDATA ("Макс. Времени, $ A $ 4," ID ", 1)" ссылки на ячейки адресуются между символ "$". Например, $ A $ 4. Если ячейка ссылается на символ $ и вы копируете формулу в другую ячейку, ячейки ссылки не обновляются автоматически. Следовательно, вы получаете тот же тип.

Возможно, вы измените формулу следующим образом, а затем скопируйте формулу в другие ячейки. Формула должна быть такой:

"GETPIVOTDATA (" Макс. Времени, A4, "ID", 1) - GETPIVOTDATA ("Макс. Времени, A4," ID ", 1)".

Спасибо.

1 голос
/ 02 декабря 2008

В 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.

1 голос
/ 02 декабря 2008

Вы были на правильных линиях с сводными таблицами. Перетащите TransID как поле строки, затем перетащите две копии Time как поля данных в сводную таблицу; щелкните правой кнопкой мыши по каждому из них и укажите Min в качестве функции суммирования для одного и Max для другого. Справа от сводной таблицы добавьте формулу для расчета разницы.

альтернативный текст http://img296.imageshack.us/img296/5866/pivottableey5.jpg

"Выглядит хорошо, единственная проблема, с которой я столкнулся, это то, что формула, которую я добавляю, имеет вид $ 4, «ID», 1). Когда я копирую это в ячейки ниже, 1 не обновляется до 2, 3 и т. Д., Поэтому все они показывают одинаковое время.

Используйте эту кнопку на панели инструментов сводной таблицы, чтобы отключить формулы GETPIVOTDATA.

альтернативный текст http://img117.imageshack.us/img117/9937/pivottabletoolbarjn3.jpg

1 голос
/ 02 декабря 2008

Чтобы добавить в пост Кибби, со ссылкой на комментарий, вы можете использовать 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 и вызывает трудности в запросах. Теперь это работает на очень простом тесте.

1 голос
/ 02 декабря 2008

Может быть, что-то так просто, как запрос, как этот.

SELECT TransID, DateDiff(mi, Min(Time),Max(Time)) AS Duration
FROM MyTable
GROUP BY TrandID
0 голосов
/ 02 декабря 2008

Иногда можно сделать что-то один раз в 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, но не в нужном формате.

Выберите столбцы A-D и скопируйте их. Используйте Специальную вставку, чтобы скопировать значения только в новый лист.

Удалите столбец B и столбец C в новом рабочем листе, чтобы осталось только TransID и Duration.

Сортировка по длительности, чтобы привести все строки со значениями рядом друг с другом.

Сортировать только строки со значениями по TransId.

Вуаля, и есть ваше решение! Надеюсь, вам не нужно повторять это!

p.s. Это не проверено

...