есть три столбца, время начало звонка, линия атс, время конца звонка. цель: нужно понять сколько линий занято в единицу времени, т.е. на сколько примерно нужно расширятся и надо ли вообще. задача: (я так думаю) сбоку от каждого звонка проставить количество занятых линий, либо графически это решить, либо посчитать время суммарное когда занято например 5 или 6 линий. сам так и ни чего не придумал. даже алгоритм понять не могу. или это вообще через эксель не решить? goo.gl/gAIxI9
есть три столбца, время начало звонка, линия атс, время конца звонка. цель: нужно понять сколько линий занято в единицу времени, т.е. на сколько примерно нужно расширятся и надо ли вообще. задача: (я так думаю) сбоку от каждого звонка проставить количество занятых линий, либо графически это решить, либо посчитать время суммарное когда занято например 5 или 6 линий. сам так и ни чего не придумал. даже алгоритм понять не могу. или это вообще через эксель не решить? goo.gl/gAIxI9Григорий
Вроде есть достаточно простое решение...элегантности смогут добавить гуру форума, заодно и мне интересно : A1:C6 - исходные данные по Станции и времени начала и окончания звонка Берем B1:B6 + C1:C6 - получаем E10:E19 (отсортированный список всех показаний времен начала и окончания звонков) F10:F18 - длительность интервала G10:G18 - количество занятых станций в этих промежутках E1:G6 - сводная, из которой видно : максимальной нагрузки не было 3 станции работали одновременно 1 минуту, или 3% времени и т.д.
Вроде есть достаточно простое решение...элегантности смогут добавить гуру форума, заодно и мне интересно : A1:C6 - исходные данные по Станции и времени начала и окончания звонка Берем B1:B6 + C1:C6 - получаем E10:E19 (отсортированный список всех показаний времен начала и окончания звонков) F10:F18 - длительность интервала G10:G18 - количество занятых станций в этих промежутках E1:G6 - сводная, из которой видно : максимальной нагрузки не было 3 станции работали одновременно 1 минуту, или 3% времени и т.д.Karbofox
На идейной основе, заложенной Karbofox, сделал вариант на VBA с использованием SQL (ADODB) - см. трансформации данных в файле на листе 2. В колонках A:C - исходные данные, в K:M - результаты расчета по VBA-процедуре selectData: кол-во используемых линий по интервалам времени. Непересекающиеся (только соприкасающиеся границами) уникальные интервалы покрывают весь используемый временной диапазон (без промежутков) - от самого раннего времени начала до самого позднего времени окончания.
Процедуру дублирую также под спойлером, чтобы потом ее быстро находить поиском. Чёрт возьми, мне иногда потом самому пригождаются собственные упражнения на Форуме!
[vba]
Код
Sub selectData()
'(если только это уже не было проделано ранее, то) 'Перед запуском в редакторе VB в меню Tools\References установить ссылку (включить галку) 'на библиотеку "Microsoft ActiveX Data Objects ... Library", где ... - номер версии. 'Можно выбрать любой максимальный (6.0, 2.8, 2.5...) из того, что установлено на компьютере.
Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset
'1. получаем все уникальные времена начала и окончания звонков 'одним общим отсортированным столбцом rst.Open _ "SELECT Begins FROM [Лист2$A:C] UNION " & _ "SELECT Ends FROM [Лист2$A:C] " & _ "ORDER BY 1 DESC" _ , cnn
[Лист2!E2].CopyFromRecordset rst rst.Close
'2. делаем искусственный сдвиг на одну запись, 'чтобы далее совместить в одной строке начало и окончание 'уникального интервала проверки rst.Open _ "SELECT Begins2 FROM [Лист2$E:E] UNION " & _ "SELECT MAX(Begins2)+1 FROM [Лист2$E:E] " & _ "ORDER BY 1 DESC" _ , cnn
[Лист2!F2].CopyFromRecordset rst rst.Close
'3. окончательно формируем все нужные уникальные интервалы времени для проверки rst.Open _ "SELECT * FROM [Лист2$E:F] " & _ "WHERE Begins2 IS NOT NULL " & _ " AND Ends2 < (SELECT MAX(Begins2)+1 FROM [Лист2$E:E]) " & _ "ORDER BY 1, 2" _ , cnn
[Лист2!H2].CopyFromRecordset rst rst.Close
'4. для каждого уникального интервала считаем звонки (линии), 'для которых этот уникальный интервал полностью содержится 'внутри времени звонка rst.Open _ "SELECT Begins3, Ends3, " & _ " (SELECT COUNT(*) FROM [Лист2$A:C] " & _ " WHERE Begins <= Begins3 AND Ends >= Ends3) " & _ "FROM [Лист2$H:I] " & _ "WHERE Begins3 IS NOT NULL " & _ "ORDER BY 1, 2" _ , cnn
На идейной основе, заложенной Karbofox, сделал вариант на VBA с использованием SQL (ADODB) - см. трансформации данных в файле на листе 2. В колонках A:C - исходные данные, в K:M - результаты расчета по VBA-процедуре selectData: кол-во используемых линий по интервалам времени. Непересекающиеся (только соприкасающиеся границами) уникальные интервалы покрывают весь используемый временной диапазон (без промежутков) - от самого раннего времени начала до самого позднего времени окончания.
Процедуру дублирую также под спойлером, чтобы потом ее быстро находить поиском. Чёрт возьми, мне иногда потом самому пригождаются собственные упражнения на Форуме!
[vba]
Код
Sub selectData()
'(если только это уже не было проделано ранее, то) 'Перед запуском в редакторе VB в меню Tools\References установить ссылку (включить галку) 'на библиотеку "Microsoft ActiveX Data Objects ... Library", где ... - номер версии. 'Можно выбрать любой максимальный (6.0, 2.8, 2.5...) из того, что установлено на компьютере.
Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset
'1. получаем все уникальные времена начала и окончания звонков 'одним общим отсортированным столбцом rst.Open _ "SELECT Begins FROM [Лист2$A:C] UNION " & _ "SELECT Ends FROM [Лист2$A:C] " & _ "ORDER BY 1 DESC" _ , cnn
[Лист2!E2].CopyFromRecordset rst rst.Close
'2. делаем искусственный сдвиг на одну запись, 'чтобы далее совместить в одной строке начало и окончание 'уникального интервала проверки rst.Open _ "SELECT Begins2 FROM [Лист2$E:E] UNION " & _ "SELECT MAX(Begins2)+1 FROM [Лист2$E:E] " & _ "ORDER BY 1 DESC" _ , cnn
[Лист2!F2].CopyFromRecordset rst rst.Close
'3. окончательно формируем все нужные уникальные интервалы времени для проверки rst.Open _ "SELECT * FROM [Лист2$E:F] " & _ "WHERE Begins2 IS NOT NULL " & _ " AND Ends2 < (SELECT MAX(Begins2)+1 FROM [Лист2$E:E]) " & _ "ORDER BY 1, 2" _ , cnn
[Лист2!H2].CopyFromRecordset rst rst.Close
'4. для каждого уникального интервала считаем звонки (линии), 'для которых этот уникальный интервал полностью содержится 'внутри времени звонка rst.Open _ "SELECT Begins3, Ends3, " & _ " (SELECT COUNT(*) FROM [Лист2$A:C] " & _ " WHERE Begins <= Begins3 AND Ends >= Ends3) " & _ "FROM [Лист2$H:I] " & _ "WHERE Begins3 IS NOT NULL " & _ "ORDER BY 1, 2" _ , cnn
думал над данными вариантами. Но они не подходят : 1 граф не подходит - на нем 2 Станция_2 , а это одна и та же. 2 граф и табличный метод (поминутный) не подходит поскольку время будет посекундное и в итоге это будет мегатаблица, т.к. 1 час - это уже 3600 записей.
думал над данными вариантами. Но они не подходят : 1 граф не подходит - на нем 2 Станция_2 , а это одна и та же. 2 граф и табличный метод (поминутный) не подходит поскольку время будет посекундное и в итоге это будет мегатаблица, т.к. 1 час - это уже 3600 записей.Karbofox
Спасибо за внимание к вопросу) Уважаемые эксперты, не сочтите за наглость - кусок оригинального файла, не могли бы прикрутить туда формулы - я попробую масштабировать) вообще очень приятно удивлен отзывчивостью на этом форуме!
Спасибо за внимание к вопросу) Уважаемые эксперты, не сочтите за наглость - кусок оригинального файла, не могли бы прикрутить туда формулы - я попробую масштабировать) вообще очень приятно удивлен отзывчивостью на этом форуме!Григорий
Посмотрите вариант. Столбец А:А - времена стартов. Столбцы B:G - счет для каждого транка, работал он в это время или нет. Столбец H - сумма работавших транков для каждого времени.
Посмотрите вариант. Столбец А:А - времена стартов. Столбцы B:G - счет для каждого транка, работал он в это время или нет. Столбец H - сумма работавших транков для каждого времени.Russel
Я выкладываю только результаты расчета - в архиве с текстовым файлом. Файл Excel даже в сжатом виде больше 100 К получается. Результаты получены процедурой из моего файла выше. Последний запрос отрабатывает несколько минут, поэтому придется подождать, если будете запускать самостоятельно. Ну и колонки Старт и Стоп придётся "заломать" под Begins и Ends (я уж не стал свои SQL-запросы менять). И шапку остальных колонок скопировать перед расчетом. Но анализ можно и по данным текстового файла выполнить, скопировав его в Excel. У меня получилось, что максимально одномоментно были заняты 3 линии. А так в большинстве случаев одна или ни одной.
Я выкладываю только результаты расчета - в архиве с текстовым файлом. Файл Excel даже в сжатом виде больше 100 К получается. Результаты получены процедурой из моего файла выше. Последний запрос отрабатывает несколько минут, поэтому придется подождать, если будете запускать самостоятельно. Ну и колонки Старт и Стоп придётся "заломать" под Begins и Ends (я уж не стал свои SQL-запросы менять). И шапку остальных колонок скопировать перед расчетом. Но анализ можно и по данным текстового файла выполнить, скопировав его в Excel. У меня получилось, что максимально одномоментно были заняты 3 линии. А так в большинстве случаев одна или ни одной.Gustav