Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка одновременных событий / 9 сообщений из 9, страница 1 из 1
25.01.2014, 23:29:45
    #38537948
Avenit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Здравствуйте!

Уже несколько дней бьюсь над задачей, но невыходит у меня каменный цветок....

Есть таблица events с полями:
start - дата начала события
end - дата конца события
name - идентификатор события в виде "имя-номер" (с этим форматом записи то и проблемы...)

Задача - получить за период к примеру текущий день выборку всех событий и полем максимальное количество одновактивных событий данного типа.


Так выбираем все записи за период, но как теперь посчитать одновременные события?

Код: plsql
1.
2.
3.
SELECT name,start,end
    FROM events
    WHERE DATE_FORMAT(start, '%Y.%m.%d')<='2014.01.24' AND DATE_FORMAT(end, '%Y.%m.%d')>='2014.01.24';
...
Рейтинг: 0 / 0
26.01.2014, 07:09:29
    #38538011
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Avenitstart - дата начала события
end - дата конца событиятак date или всё же datetime? если второе, то например так

Код: sql
1.
2.
3.
4.
5.
6.
7.
select t.sec,count(*) cnt
from (select date_add('20140124',interval num seconds) sec from numbers where num<=86400) t
join events e on t.sec between e.start and e.end
where e.start<='20140124' and e.end>'20140124'
 and <условие на тип событий, я не понял, где и как он у вас задаётся>
group by t.sec
order by cnt desc limit 1

numbers - заранее сгенерированная таблица с числами от 1 до (минимум) 86400.
...
Рейтинг: 0 / 0
26.01.2014, 16:54:12
    #38538315
Avenit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Спасибо за ответ, вот пример таблицы и данных:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE IF NOT EXISTS `events` (
  `start` datetime NOT NULL,
  `end` datetime NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `events`
--

INSERT INTO `events` (`start`, `end`, `name`) VALUES
('2014-01-26 03:00:00', '2014-01-26 04:00:00', 'testa-1'),
('2014-01-26 05:00:00', '2014-01-26 05:10:00', 'testa-2'),
('2014-01-26 06:00:00', '2014-01-26 06:30:00', 'testa-3'),
('2014-01-26 06:20:00', '2014-01-26 06:40:00', 'testa-4'),
('2014-01-26 04:00:00', '2014-01-26 10:00:00', 'testb-5');



Результатом запроса (в запросе задан период start<=2014-01-26 AND end >=2014-01-26, т.е. все строки, где время действия подпадает под заданный период. Событие может начинаться до заданного периода и заканчиваться после него) должна быть такая таблица таблица:
Код: plsql
1.
2.
3.
event_name         cnt
testa               2
testb               1
...
Рейтинг: 0 / 0
26.01.2014, 16:56:16
    #38538316
Avenit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
В таблице к тому же могут быть записи с повторяющимся полем name, но другом периодом естественно, например:
Код: plsql
1.
2.
INSERT INTO `events` (`start`, `end`, `name`) VALUES
('2014-01-26 12:00:00', '2014-01-26 12:30:00', 'testa-1');
...
Рейтинг: 0 / 0
26.01.2014, 22:21:47
    #38538487
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Avenitдолжна быть такая таблица таблица:
event_name cnttesta 2testb 1
А по-моему, в первой строке должн быть 3, а не 2...

Постановка задачи совершенно пьяная и невменяемая. Попробуйте переформулировать задачу...
...
Рейтинг: 0 / 0
27.01.2014, 01:07:10
    #38538550
Avenit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Нет, все верно.
testa-3 и testa-4 с 6:20 до 6:30 были одновременно активны, это максимум одновременно активных, поэтому 2.
...
Рейтинг: 0 / 0
27.01.2014, 08:30:28
    #38538590
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
tanglir
Код: sql
1.
where e.start<='20140124' and e.end>'20140124'

ошибочка, надо так (за 24 число):
Код: sql
1.
where e.start<'20140125' and e.end>='20140124'
...
Рейтинг: 0 / 0
27.01.2014, 08:50:26
    #38538597
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Avenit , ааа, вон оно как.
Т.е. я верно понял. что если идут события

10:00-11:00
10:10-10:20
10:40-10:50

то ответ тоже 2?

Если так, то для группы достаточно для каждой записи посчитать, сколько раз начало события находится между началом и концом других событий, и взять максимум этого значения (плюс адын). Группить надо по имени (т.е. тупо по выражению SUBSTRING_INDEX(name, '-', 1))
...
Рейтинг: 0 / 0
27.01.2014, 08:57:33
    #38538598
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка одновременных событий
Т.е. навскидку без фильтрации по дате будет что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT sq.name, MAX(sq.cnt) cnt
(
  SELECT SUBSTRING_INDEX(t1.name, '-', 1) name
       , SUM(t2.start BETWEEN t1.start AND t1.end) cnt
  FROM datatable t1, datatable t2
  WHERE SUBSTRING_INDEX(t1.name, '-', 1) = SUBSTRING_INDEX(t2.name, '-', 1)
  GROUP BY SUBSTRING_INDEX(t1.name, '-', 1)
) sq
GROUP BY sq.name


Есссно фильтр по дате достаточно ввести в подзапросе только по первой копии. Или по двум - в зависимости от постановки задачи.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка одновременных событий / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]