Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пересечение временных интервалов 
:(
    Опции темы
martin88
Дата 4.12.2015, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 29.3.2012

Репутация: нет
Всего: нет



Есть табличка, где хранится история подключений (дата начала подключения и дата конца)

Код

CREATE TABLE `statistic` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `date_start` datetime(6) NOT NULL,
   `date_end` datetime(6) NOT NULL, 
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Таблица содержит много тысяч записей. Задача: построить графики одновременных подключений (по часам, дням, неделям и тп), для демонстрации пиковых нагрузок. Как это вообще сделать? (я имею ввиду запрос к БД чтобы получить кол-во одновременных подключений по часам/дням/неделям). То есть найти кол-во всех записей с пересекающимися интервалами. 

Верна ли вообще структура таблицы для данной задачи?

Это сообщение отредактировал(а) martin88 - 4.12.2015, 18:15
PM MAIL   Вверх
martin88
Дата 4.12.2015, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 29.3.2012

Репутация: нет
Всего: нет



То есть мне нужно узнать максимальное кол-во ПЕРЕСЕЧЕНИЙ интервалов (за период времени или без него)
Код

_______
             ________                 __________
                              ____
     __________

На этой илюстрации - 5 длящихся событий. Максимальное кол-во одновременных событий = 2

PM MAIL   Вверх
ТоляМБА
Дата 5.12.2015, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 10
Всего: 252



Код
select count(s.id) as col, s1.id as id1
from statistic as s
inner join statistic as s1
on s.id > s1.id
where s.date_start between s1.date_start and s1.date_end
or s.date_end between s1.date_start and s1.date_end
group by s1.id


col покажет количество записей с которыми пересекается соответствующий id

Код
select max(col)+1 as crcol
from
(select count(s.id) as col, s1.id as id1
from statistic as s
inner join statistic as s1
on s.id > s1.id
where s.date_start between s1.date_start and s1.date_end
or s.date_end between s1.date_start and s1.date_end
group by s1.id) as A


покажет максимальное кол-во ПЕРЕСЕЧЕНИЙ интервалов.

За достоверность не ручаюсь, нужна проверка.
PM   Вверх
martin88
Дата 7.12.2015, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 29.3.2012

Репутация: нет
Всего: нет



Спасибо, ваш запрос работает. Но по 4 тысячам записей идет 19 секунд.... (((
Сменил тип с MyISAM на InnoDB - 2.5 секунды.

А можно ли как-то разложить на периоды по часам от 0 до 23 (в этом же запросе) типа

0-00 - 55 запросов
1-00 - 4 запроса
2-00
3-00
...
23-00



Это сообщение отредактировал(а) martin88 - 7.12.2015, 14:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.