|
|
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Есть таблица с двумя столбцами дата_начала, дата_конца. Задача выяснить максимальное количество строк диапазоны которых дата_начала и дата_конца пересекаются. Например это может быть звонковая таблица с началом и окончанием звонка, тогда задача формулируется: выяснить максимально количество звонков, которые были одновременно (пиковая нагрузка). В таблице находятся звонки совершенные за сутки. У меня есть пока две идеи как можно решить такую задачу. 1-ый Вариант: берем каждую строку таблицы и по дате начала из этой строки соединяем табличку саму на себя и считаем сколько звонков было одновременно с этой строчкой. Далее выбираем максимальное количество звонков. 2-ой Вариант: Поскольку звонки в таблице только за сутки. Разбиваем сутки на N точек времени и в каждую точку времени считаем количество звонков. Потом выбираем максимальное количество. Естественно это вариант теряет в точности т.к. некоторые звонки могут потерятся и не будут учтены. Звонков много поэтому первый вариант будет очень долго отрабатывать. Второй вариант будет быстрее (в зависимости от количества на сколько точек разобьются сутки), но он теряет в точности. Подскажите, пожалуйста, может есть какое еще оптимальное решение данной задачи? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 10:02 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Буремигзадача формулируется: выяснить максимально количество звонков, которые были одновременно (пиковая нагрузка). Что должно получиться на таких данных? дата_началадата_конца00:01:0000:02:0100:02:0000:03:0100:03:0000:04:0100:04:0000:05:01 ......23:57:0023:58:0123:58:0023:59:01 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 10:12 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Буремиг, count(звонок) over(order by время range between current row and interval 'одновременно' minute|/second following) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 10:35 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
БуремигПодскажите, пожалуйста, может есть какое еще оптимальное решение данной задачи? 1. Количество одновременных звонков меняется в момент начала очередного звонка (увеличивается) и завершения (уменьшается). Максимальное количество достигается в момент увеличения. Таким образом, имеет смысл считать количество звонков только на date_start каждого звонка. 2. Количество одновременных звонков = номер_звонка_по_порядку - количество_успевших_завершиться. Отсюда вывод: строится выборка вида (дата_начала; кол-во успевших завершиться с предыдущей даты начала) и в общем уже всё просто. 3. Если задача учебная, то, думаю, хватит. Если же боевая - подозреваю, что оптимальная реализация таки будет PL/SQL-ной, причём формулировка сменится с "найти точную пиковую нагрузку" на что-нибудь типа "найти интервалы времени, когда нагрузка не менее 70% от пиковой". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 10:52 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Отправной запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. P.S. PL/SQL тут отдыхает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 11:32 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
softwarer1. Количество одновременных звонков меняется в момент начала очередного звонка (увеличивается) и завершения (уменьшается). Оно уменьшается "в момент, следующий за завершением звонка". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 11:38 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
SQL*PlusОно уменьшается "в момент, следующий за завершением звонка". Не подскажете ли, какое именно число "следует за числом 1.28342"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 11:41 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
softwarerSQL*PlusОно уменьшается "в момент, следующий за завершением звонка".Не подскажете ли, какое именно число "следует за числом 1.28342"?Не подскажу... :-) Но в звонках используются DATE. Значения этого типа данных дискретны. "момент, следующий за завершением звонка" = "дата-время завершения звонка" + 1 секунда. "По-моему, так!" :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 11:58 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
SQL*PlusНо в звонках используются DATE. Значения этого типа данных дискретны. Значения любого примитивного типа данных дискретны. В том числе number-а. SQL*Plus"момент, следующий за завершением звонка" = "дата-время завершения звонка" + 1 секунда. "По-моему, так!" :-) Даже если формат представления непрерывных данных дискретен, попытка работать с ними в этом ключе приводит только к дополнительному геморрою, имхо. Грубо говоря, из вариантов Код: plaintext 1. 2. весьма трудно назвать хоть какой-либо плюс третьего. В том числе и с точки зрения бизнес-логики гораздо удобнее работать на полуоткрытых интервалах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:22 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
softwarerиз вариантов Код: plaintext 1. 2. весьма трудно назвать хоть какой-либо плюс третьего. Один плюсик таки есть: его можно переписать как Код: plaintext В то же время вариант 1 в запросе сразу выдает "нуба", который вскоре придет с просьбой "ускорить запрос". Не на 100%, но на 98 - точно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:29 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
softwarer, Мы обсуждали когда наступает момент уменьшения кол-ва звонков. Если это правильно и понятно определено, то способы учета данного факта - это уже дело техники. P.S. Замечу, что для реальных расчетов секунда туда-сюда не имеет практически никакого значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:30 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
[quot SQL*PlusP.S. Замечу, что для реальных расчетов секунда туда-сюда не имеет практически никакого значения.[/quot] Ну не скажите. Имеет, причем существенное - если работаете с "версионными" объектами с заданными интервалами существования версий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:32 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Буремиг, Как мне кажется будет работать ваш второй вариант с разбивкой на N точек времени, но делать это не через равный промежуток времени, а в моменты начала очередного звонка (соотвественно убрав дубликаты из этих точек времени), т.к. пиковая нагрузка возникает именно в начале какого-то определенного звонка (-ов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:37 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
softwarerБуремигПодскажите, пожалуйста, может есть какое еще оптимальное решение данной задачи? 1. Количество одновременных звонков меняется в момент начала очередного звонка (увеличивается) и завершения (уменьшается). Максимальное количество достигается в момент увеличения. Таким образом, имеет смысл считать количество звонков только на date_start каждого звонка. Спасибо, за идею с тем, что достаточно посчитать количество завершенных звонков, на текущий момент. Elic Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Спасибо, за наглядную демонстрацию. Не додумался, что начало и конец звонка можно в одно поле сложить с весом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:38 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousSQL*PlusP.S. Замечу, что для реальных расчетов секунда туда-сюда не имеет практически никакого значения.Ну не скажите. Имеет, причем существенное - если работаете с "версионными" объектами с заданными интервалами существования версий.Я не совсем точно выразился. Имелось в виду - для реальных статистических расчетов. При использовании "версионных" объектов для статистики крайне важно однозначное понимание "что такое сутки" всеми приложениями и их пользователями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:39 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
SQL*Plus, softwarer Мне кажется что ваш спор насчет момента завершения звонка имел бы место быть если бы необходимо было определить максимальную пиковую нагрузку и интервал времени который он продолжался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:41 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
UScorpБуремиг, Как мне кажется будет работать ваш второй вариант с разбивкой на N точек времени, но делать это не через равный промежуток времени, а в моменты начала очередного звонка (соотвественно убрав дубликаты из этих точек времени), т.к. пиковая нагрузка возникает именно в начале какого-то определенного звонка (-ов). Звонков много. Такой алгоритм тормозить будет. Elic - классную идею подал. За один проход получаем для каждого звонка, сколько звонков было еще активных. Плюс второй проход на выяснение максимума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:41 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
UScorp SQL*Plus, softwarer Мне кажется что ваш спор насчет момента завершения звонка имел бы место быть если бы необходимо было определить максимальную пиковую нагрузку и интервал времени который он продолжался Хотя из Буремиг Есть таблица с двумя столбцами дата_начала, дата_конца. Задача выяснить максимальное количество строк диапазоны которых дата_начала и дата_конца пересекаются. так и выходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:46 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
UScorpUScorp SQL*Plus, softwarer Хотя из [quot Буремиг] Есть таблица с двумя столбцами дата_начала, дата_конца. Задача выяснить максимальное количество строк диапазоны которых дата_начала и дата_конца пересекаются. так и выходит Задача только узнать пиковую нагрузку. Временные диапазоны пиковой нагрузки не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 12:52 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousОдин плюсик таки есть: его можно переписать как что временами слегка повышает читабельность. Имхо, это "временами" исчезающе мало. andrey_anonymousВ то же время вариант 1 в запросе сразу выдает "нуба" Поэтому приведены второй и третий :) Но первый таки куда лучше, например, в if-е. SQL*PlusМы обсуждали когда наступает момент уменьшения кол-ва звонков Не совсем так, имхо. "Когда наступает момент" - вопрос довольно философский, уровня хлопка одной ладонью. Мы знаем, когда пользователь нажал на кнопку, а вот "в этот момент звонок ещё есть или уже нет" - можно спорить совершенно попусту неограниченное количество времени; не думаю, что мы хотим этим заниматься :) Для практических задач имеет смысл вопрос, например, "оборудование занято обслуживанием звонка или свободно и может обслужить другой звонок". Время наступления нового статуса мы можем чётко определить и вопросов это не вызовет. Грубо говоря, нас интересует, сколько надо телефонных линий, чтобы обслужить звонки 10:00:00 - 10:01:00 и 10:01:00 - 10:02:00 - то ли одна, то ли две. Согласны? И, наконец - что мы собственно, имхо, обсуждаем - одни и те же данные можно хранить по-разному. Можно хранить в варианте (первая_секунда_когда_оборудование_стало_занято; последняя_секунда_когда_оно_ещё_было_занято), можно в варианте (первая_секунда_когда_оборудование_стало_занято; первая_секунда_когда_оно_стало_свободно). SQL*PlusP.S. Замечу, что для реальных расчетов секунда туда-сюда не имеет практически никакого значения. Зато могут иметь значение технические детали, например то, что переключение само по себе занимает время. Так или иначе, здесь имхо главное, о чём стоит упомянуть - проектировать данные и работать с ними имхо следует таким образом, чтобы не заморачиваться "плюс-минус секундами". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2010, 13:04 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Elic Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Через 7+ лет спасибо, но есть маленький нюанс. если звонки начинаются или заканчиваются в один момент времени -необходимо чуть изменить запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 17:37 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Vintесли звонки начинаются или заканчиваются в один момент времениtimestamp-ы не на винде одинаковыми не бывают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 18:03 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Vintнеобходимо чуть изменить запрос:После Vint Код: plsql 1. становится ненужным Vint Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 18:18 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Elic, к тебе никаких претензий) мне понадобилось считать проживающих в диапазоне по дням. и там и начинаться и заканчиваться могут в один день. поэтому для тех кто выезжает в один день еще и start_of_group для объединения интервалов пришлось добавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 18:20 |
|
||
|
Задача с пересекающимися диапазонами
|
|||
|---|---|---|---|
|
#18+
Vint, я 7+ лет не могу понять тайный смысл cnt not between 1 and 4 and (заработался я наверное) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 18:36 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=36752145&tid=1884342]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 373ms |

| 0 / 0 |
