|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Добрый день! Прошу помощи в составлении запроса. Условие: Есть таблица NumData(id, num_beg, num_end, num_gr) Надо определить вхождение(пересечение) номера с любым из интервалов в строках от num_beg до num_end и вывести в таком виде: Номер 22 уже входит в диапазон группы (num_gr) 1, Основной запрос уже есть (достает пересечение номеров), но как вывести группу не прибегая к pl_sql - пока не понял (может быть не одно число на вход, а интервал). В случае интервала результат такой: Номера 21, 22, 23 уже входят в диапазон группы 1, Номера 33, 35 уже входят в диапазон группы 3. В таблице не может быть изначально пересекающихся диапазонов, т.е. одно входящее число может пересекаться лишь с одним из диапазонов одной группы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Если добавить группу к внешним запросам, то не сработает сквозной поиск пересечения. Подскажите, как сделать? В идеале бы ещё отсортировать результат по группам... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 16:28 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Можно результат вывести так: Группа / Список с разделителями пересечений по группе 1/21,22,23 3/33,35 и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 16:41 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Сделал другим способом. Этот можно оставить как вариант для тренировки, если интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 17:58 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
ARRay001, пересечение з - по Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 18:01 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Stax, listagg - забыл совсем про него) Спасибо, здОрово! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 23:30 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Stax, правда я наверное не совсем так написал постановку. Диапазоны в таблице должны сравниваться с входящим числом или входящим интервалом. Примерно так: Интервал от 12 до 22 (входящий): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Только тут не делается в строку... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 23:50 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Кроме этого, последний пример не выводит конкретных начальных и конечных номеров по группам, по которым происходит пересечение. В приведенном выше примере должно получиться, если входящие beg=1 и end=3: with t as ( 2 select 1 gr,1 z, 5 po from dual union all 3 select 2 gr,7 z, 10 po from dual union all 4 select 3 gr,3 z, 6 po from dual union all 5 select 4 gr,2 z, 9 po from dual union all 6 select 5 gr,11 z, 13 po from dual ) Вывод: Группа/Пересечения 1 1,2,3 4 2,3 Но в реале так не может быть, т.к. в таблице уже есть пересечение, чего быть не может. Будет только одна строка в выводе. Несколько строк могут получиться, если входящий диапазон перекрывает диапазоны нескольких групп. Например, 4-8: Вывод: Группа/Пересечения 1 4,5 2 7,8 3 4,5,6 4 4,5,6,7,8 Моё решение не подошло, так что вопрос пока остается открытым. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 02:23 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Тысячекратно извиняюсь. НО! Вам вряд ли сможет кто-то помочь даже если захочет. Плохо сформулированная задача. Ее каждый для себя может понять по своему и дать ответ который вам не подойдет ! Вы написали что у вас есть таблица с определенными полями, затем вы пишите "определить вхождения номера". Какого номера ? Порядкового ? У вас в таблице есть id, если про него то так и пишите id. Далее, на небольшом примере покажите исходные данные и что должно получиться, и постарайтесь что бы не было многозначности в формулировках. Подготовьте наборы данных. Один исходный, другой с результатом, из которых ОДНОЗНАЧНО понятно что должно получиться ! Если не хватает скиллов, то просто опишите на пальцах проблему, которую решаете (if !NDA ). Как всем известно без ТЗ результат ... соответсвующий. Потрудитесь сформулировать, а не выкидывать на форум свой слепок мозга. Удачи ! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 12:03 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 15:43 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
SY, listagg, between &beg and &end сразу под lateral ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2021, 15:15 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Stax SY, listagg, between &beg and &end сразу под lateral stax IMHO добавит сложности в понимании/читабельности и вряд ли даст ощутимый прирост производительности разве что у ТС очень большие интервалы z - po и очень маленькие интервалы &beg - &end. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2021, 15:30 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
SY, Спасибо - то, что нужно! Мне ещё надо разобраться с применением lateral. Можно ещё расширить задачу: на вход подается не интервал или число, а список целых чисел с разделителем ';'. Ищем так же вхождение каждого из этих чисел со всеми интервалами в таблице с таким же выводом. В pl/sql делал коллекциями multiset intersect distinct, думаю можно проще сделать, расширив данный запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2021, 23:27 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
ARRay001 В pl/sql делал коллекциями multiset intersect distinct, думаю можно проще сделать, расширив данный запрос. Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 01:41 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
SY, Почти то, только вместо табличного представления: driver as ( select 1 b,3 e from dual union all select 4,8 from dual ) на входе: driver as ( select '1;3;4;8' from dual; ) Либо тогда надо преобразовать это в таблицу либо как-то иначе... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 02:16 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
ARRay001 на входе: driver as ( select '1;3;4;8' from dual; ) Либо тогда надо преобразовать это в таблицу либо как-то иначе... Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 03:04 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
SY, Нечто такое предполагал, но как-то не осознал. А как будет выражение Код: plsql 1. 2. 3. 4.
если все числа запихиваем в один столбец b (интервал between d.b and d.b) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 03:34 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Понял: Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 04:03 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Подскажите, пож, как в данном запросе (сделал по образцу выше) ограничить количество выводимых pp в каждой группе (gname). Что-то никак не пойму. Предполагаю аналитику с интервалом в подзапросе, но не уверен. Жаль у listagg нет ограничителя по подгруппам. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 15:11 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Уточню что нужно: чтобы по каждой группе выводилось не более 5 номеров. Т.е.: Группа1 | 1,2,5,6,9 (максимум 5 первых номеров при сортировке от меньшего к большему или случайно - лишь бы 5) Группа2 | 34,55,3 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 15:50 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
ARRay001, запутали Вы меня, у Вас список('1;3;4;8' ), или з/по (no_beg/t.no_end)? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 16:17 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Stax, в данном примере ищется пересечение интервала between 1 and 100 с интервалами в полях таблицы t.no_beg и t.no_end в рамках группы (столбец gc.name). И надо чтобы вывод результата ограничивался первыми 5 значениями как по группам (уже есть), так и по номерам в каждой группе. Проблема в том, что может быть несколько строк по каждой из групп. Т.е. надо брать первые 5 значений с начала каждой группы и потом уже применять listagg. Без ограничения оно работает... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 16:37 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
ARRay001, ('1;3;4;8' ) ето два диапазона 1-3 и 4-8, или четыре елемента? ps приведите пример таблиц, и что плучить ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 16:50 |
|
Пересечение диапазонов номеров
|
|||
---|---|---|---|
#18+
Stax, with tbl_list as ( select 1 group,21 no_beg,21 no_end from dual union all select 1 ,22 ,22 from dual union all select 1 ,1 , 4 from dual union all select 2 ,12 ,20 from dual union all select 2 ,45 ,47 from dual ) а из tbl_group gc достается имя группы gc.name => tbl_list.group = gc.id Интервал 1..100 Ожидаемый результат (числа на пересечении диапазонов:): Группа | Сrosspoints 1 | 1, 2, 3, 4, 21 (далее отрезано) 2 | 12, 13, 14, 15, 16 (далее отрезано) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 17:18 |
|
|
start [/forum/topic.php?fid=52&fpage=17&tid=1880117]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 170ms |
0 / 0 |