|
|
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
Задача условно. На полке склада лежат товары, но период каждого товара учитывается отдельно. То есть: id полки, id товара, date_from, date_to То есть каждый товар учтен отдельно в отношении каждой полки. Необходимо вывести историю полки, в которой отразить периоды с полным списком товаров, лежащих в ней в определенный период. Примерный вариант (id считаем, как id товара и полка для примера одна, т.е. id полки в исходных данных нет): Код: 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. Но на относительно больших данных запрос работает категорически долго. Поэтому вопрос, может есть вариант не раскладывать все периоды на количество дней с последующим джойном и схлопыванием диапазонов по sog? Как-то сразу может с sog сообразить? -- Была еще мысль, исходить из того, что если два диапазона пересекаются, то: 1. если они полностью совпадают - все без изменений 2. если совпадает только одна из границ или границы не совпадают, то один из диапазонов бьется на части, т.е. из двух записей образуется третья (пересечение), + корректириуются границы исходных диапазонов с учетом пересечения. Т.е. если два диапазона пересекаются (но не четко по границам), на выходе в любом случае получаем уже три записи. Т.е. лефт джоин исходного набора с самим с собой (условия отд. тема) + крос джоин с level < 4 (3 диапазона) и в зависимости от левела кейсами выставляем date_from и date_to. Но работающего варианта пока не получил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 23:53 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотонаТ.е. если два диапазона пересекаются (но не четко по границам), на выходе в любом случае получаем уже три записи Не записи 3, а 3 диапазона, а записей будет от 3 до 4 (1-2 для каждого из id в пересечении и по одной исходной с границами, отредактированными с учетом пересечения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 23:59 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотона, развернуть существующие диапазоны в список точек вида: дата точки, тип точки (начало кончало) после чего свернуть точки в новые диапазоны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 05:04 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Спасибо, попробую, правда не очень понимаю пока как сворачивать, одновременно агрегируя id в список. Видимо надо развернуть в список точек, потом агрегация id, а потом свернуть диапазоны? Т.е. разница только в том, что разворачиваем не на весь список дат, а в граничные точки диапазонов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 07:29 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 07:45 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эхпохожая тема Смотрел по результатам примеров - не нашел там агрегации при схлопывании. Сейчас вижу так, разворачиваем на точки, потом идем по списку и в зависимости от типа даты либо добавляем Id в список, либо удаляем (но тогда запрос видимо должен быть рекурсивным и еще список id должен быть отсортирован, дабы проще в дальнейшем искать изменения в результирующем наборе), потом схлопываем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 08:00 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#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. где таблица t1 создана для входных переменных (мне лень было передавать переменные vStart_date, vEnd_date и я ввел таблицу t1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:50 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эхацкийсотона, развернуть существующие диапазоны в список точек вида: дата точки, тип точки (начало кончало) после чего свернуть точки в новые диапазоны... ему нельзя сворачивать, потеряет ид ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:21 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотонаЗадача условно. На полке склада лежат товары, но период каждого товара учитывается отдельно. То есть: id полки, id товара, date_from, date_to То есть каждый товар учтен отдельно в отношении каждой полки. Необходимо вывести историю полки, в которой отразить периоды с полным списком товаров, лежащих в ней в определенный период. Примерный вариант (id считаем, как id товара и полка для примера одна, т.е. id полки в исходных данных нет): Код: 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. Но на относительно больших данных запрос работает категорически долго. Поэтому вопрос, может есть вариант не раскладывать все периоды на количество дней с последующим джойном и схлопыванием диапазонов по sog? Как-то сразу может с sog сообразить? -- Была еще мысль, исходить из того, что если два диапазона пересекаются, то: 1. если они полностью совпадают - все без изменений 2. если совпадает только одна из границ или границы не совпадают, то один из диапазонов бьется на части, т.е. из двух записей образуется третья (пересечение), + корректириуются границы исходных диапазонов с учетом пересечения. Т.е. если два диапазона пересекаются (но не четко по границам), на выходе в любом случае получаем уже три записи. Т.е. лефт джоин исходного набора с самим с собой (условия отд. тема) + крос джоин с level < 4 (3 диапазона) и в зависимости от левела кейсами выставляем date_from и date_to. Но работающего варианта пока не получил. 1) "больших данных" ето сколько? 2) t4 долго считает? на каком етапе главний тормоз? дальше надо пробовать, напр 1) отказаться от генерации мах/мин диапазона дат t3, попробовать генерить дни для каждой строки 2) отказаться от старт оф групп, свернуть через ровнум ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:41 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:50 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, t3 ето ж "развернуть существующие диапазоны в список точек вида: ..." Ваш хитрый select start_date from t0 union select end_date from t0 зи обычная задачка на пересечение интервалов часто рашают в лоб (без т3) select ... from t0 t1,t0 t2 where пересечение t1 i t2 но как поведет себя алгоритм "на относительно больших данных " я не знаю, надо пробывать ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:01 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
stax.., вводил t3 больше для понимания/тестирования (чтоб не перегружать один селект) ... как его реализовать через union или "моим хитрым" =) тут уже автор пусть тестонет по скорости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:14 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXLацкийсотона, Второй вариант (корректированный первый) =) Код: 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. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:38 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
stax.., Ваша правда Уважаемый тогда выкинем группировочку т.о. задача будет удовлетворять условию, а надо ли делать 1 непрерывный интервал для одинаковых наборов автор не уточнял =) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:40 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXLstax.., Ваша правда Уважаемый select level cBeg from dual connect by level = 2; интересная фича, можно спрашивать на собеседованиях ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:51 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, спасибо бальшущее, работает отлично, но с небольшой неточностью, берем упрощенный набор данных: 1. Исходный вариант (тяжелый): Код: 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. Вариант 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вариант 2 (корректированный первый): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вариант 3: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. То есть ни один из трех последних не дает тот же результат, что исходный вариант. Но работает конечно несравнимо быстрее, немного поправили: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Немного лучше, но до исходного результата пока тоже не дотягивает, надо как-то хитрее формировать пограничные даты что ли. stax..интересная фича, можно спрашивать на собеседованиях select 2 ++ (-2) from dual; Я б даже на такой вопрос ответил бы неверно (но это наверно баян, да еще может и из доки )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 21:04 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотонаselect 2 ++ (-2) from dual; Зачем так просто, лучше сразу спрашивать что вернет и почему результаты отличаются Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 21:47 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотона, Да, немного накосячил с <>, сорри Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но от условия в t3 Код: plsql 1. 2. 3. я бы не отказывался, без него вся таблица попадет под выборку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 11:40 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотона, Вот еще Вариант 4 например: Код: 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. отказался от t1, таки ввел переменные =) попробуй такой, но по времени даже не скажу =( может и не лучший вариант. была бы база - может и по другому бы сделал =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 16:36 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, імхо хуже будет зи в т3 order by Date_line ? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 18:02 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотонаНемного лучше, но до исходного результата пока тоже не дотягивает, надо как-то хитрее формировать пограничные даты что ли. то что сразу вылезло, ето отлично берете конкретную полку и конкретный товар по которому не сходится, и сличаете, ищете непредвиденный/неописанный нюанс возможно в ісходном неправильно, и такое бывает ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 18:08 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#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. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 18:36 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
MaximaXXLацкийсотона, Да, немного накосячил с <>, сорри было луче, нарезанные кусочки t3 должны полностью входить в исхожные интервальчики Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 18:43 |
|
||
|
Пересечение диапазонов (переписать start of group)
|
|||
|---|---|---|---|
|
#18+
ацкийсотона, Вариант 5 (модификация 4-ки). Вернул t1 как входные параметра. Сделал t2 как t0 с наложенными первичными условиями. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 20:46 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=161&tid=1885860]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 325ms |

| 0 / 0 |
