Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
Добрый день, господа! Есть у меня одна задача - учесть непрерывное время которое провел человек с накладными на руках: У таблицы тривиальная структура: ID_N - идентификатор накладной, ID_U - идентификатор сотрудника, DT_B - дата выдачи накладной, DT_E - дата сдачи накладной Интервалы пересекаются - то есть человек может взять три накладные, две сдать, одна на руках (причину любую на ваш вкус), взять еще одну... затем сдать обе. Итак есть сырые данные: Код: sql 1. 2. 3. 4. 5. 6. Наклепал запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. работает адски долго. видимо вложенные SELECT с агрегатными функциями тяжко даются. Вытащил самый сок, чтобы посмотреть что он выбирает: Код: sql 1. 2. 3. 4. 5. 6. а он не выбирает крайние накладные: Код: sql 1. 2. 3. 4. собственно хотелось бы получить начало и конец периода где накладные пересекаются, для наглядности: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2018, 20:38 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, А может ли один сотрудник взять одну и ту же накладную несколько раз? Если сортировать по началу, то записи, которые заканчиваются раньше, чем конец предыдущей входят в непрерывное время. Может lag/lead тут удобнее будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2018, 21:30 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, концептуально-архитектурно надо сначала решить, (не говоря о том что T-SQL конечно может много чего разрулить - но не обязательно будет самым эффективным средством) так понимаю какой именно накладной - не важно, т.е. ID_WT в данном контексте не нужно, остаются интервалы и сотрудник будет множество случаев, оптимальное решение для разных типов будет различаться тип 1 есть крайние пересекающиеся интервалы min(dt_b) ~ max(dt_e) для разных накладных и куча смешанного солянки между ними тогда естественно всё что между ними (крайними интервалами) - пересчитывать не надо datediff(min(),max()) тип 2 интервал только один datediff(min(),max()) тип 3 последовательность пересекающихся интервалов datediff(min(),max()) тип 4 последовательность непересекающихся интервалов считать для каждого, потом сумма тип 5 смесь тип 3 и тип 4 тут целое поле возможных сценариев решений различные группировки по приведению к типу 3 - от него к типу 2, потом эти непересекающиеся группы по типу 4 и т.д. (вариантов подходов хватает, мерять производительность надо) ну для упрощения всякие обёртки дополнительной логики - типа dt_e not null , т.е. dt_e default = now() для отчёта (может пропустил какой тип) так что для начала надо-бы исследовать доминирование какого-то типа в самих данных из допустим какого-то случайного образца в скажем 1000 работников (фактически частота каждого сценария по типам не повторяясь, т.е. отнести к максимальному), затем оценить по каким именно типам наиболее часто пускаются расчёты и потом уже на основании результата писать алгоритм запроса чтобы был баланс покрытия большого количества случаев необходимых для отчётности с приемлемым временем. (если там ещё какой внутренней классификации по приоритетности нет, типа для одного начальника это всегда срочно, для другого хватает раз в месяц рассылку делать). если предварительно писать логику классификации случая (на основе решения которой будет собственно и выполнен подходящий алгоритм по оптимальности) - то в принципе добавит время на предварительную оценку - но скорее всего ускорит время на остальные расчёты для данного работника. или писать что-то универсальное - но больше заточенное под самые необходимые случаи, с прицелом на минимизацию общего времени. это к тому что решение об оптимальным балансе приоритетов между разными операциями/нодами древа решений логики подзапросов придётся подбирать самому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2018, 21:33 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2018, 22:44 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
invm, отлично! получил все пересекающиеся интервалы, приправил их накладными которые не пересекаются, получил минуты в день. Код: sql 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. только вот теперь думаю как пронумеровать полученные интервалы и составить соответствие накладной интервалу? ведь получается что хоть одна хоть пять накладных могут относиться к одному интервалу но Код: sql 1. пропускает все id_wt что находятся внутри... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 18:21 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
PizzaPizza, накладная берется один раз и сдается один раз. сортировать по всей видимости нет смысла, т.к. есть накладные номер которой больше а дата начала сборки раньше чем у предыдущей - по стеку накладные могут перемещаться с разной скоростью у разных работников, отсюда и разные даты начала при последовательных номерах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 18:34 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
vikkiv, Я подумал и понял что терять накладную внутри интервала было бы нехорошо, с точки зрения статистики. К тому же в перспективе захочется провалиться куда нибудь в количество позиций накладной, количество коробок, вес, объем и прочее... Думаю должна существовать таблица соответствия интервала накладной, а не сотруднику, т.о. и накладная не будет потеряна и по сотруднику можно посчитать интервалы. Видится мне такая картинка: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 18:49 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
invm, Сейчас заметил что предложенный вами алгоритм не работает Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 19:12 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, смотря что ты считаешь держанием накладной (хотя важно-ли какая именно накладная - в задаче не говорится) 1) можно считать время удержания на руках (не важно сколько штук) 2) а можно считать время нахождения каждой накладной на руках и считать суммарное время (т.е. время на количество) мой вариант (где накладная не важна) подразумевал первый сценарий. другое дело за ранее предусматривать в алгоритме остальные возможные комбинации вариантов наращивая сложность и теряя производительность без необходимости - довольно сомнительное занятие, ну если только уже не знаешь всё ширину проекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 19:15 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
vikkiv, вопрос производительности не стоит. Если будем считать в лоб все накладные которые держал работник на руках (при этом допускается одновременное) - получим суммы среднепотолочные )) Цель проекта - оптимизация склада. Моя задача посчитать сколько времени у человека на руках накладные, если их несколько - необходимо посчитать период, указать какие накладные относятся к какому периоду. Терять накладные в недрах периода нельзя, т.к. статистическая/количественная составляющая будет утеряна. Если учесть все накладные которые были на руках в одном периоде - можно просчитать какие товары поставить рядом чтобы минимизировать перемещение сотрудника. Посчитать сколько КГ или кубометров перенес, можно группировать схожие по расположению накладные в стеке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 19:30 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, хорошо, пока всё плавающее и допускающее множественные интерпретации... так что с учётом того что формат входных данных уже задан - неплохо-бы определить в такой-же табличной форме (а этим в данном контексте и оперирует SQL) что нужно на выходе, в процессе заодно получится самому более чётко определится с требованиями (даже возможно пару вариантов таблиц на разные отчёты) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 20:48 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159Сейчас заметил что предложенный вами алгоритм не работаетЗначит неверные исходные данные - есть строки, где DT_E < DT_B. AR159необходимо посчитать период, указать какие накладные относятся к какому периоду Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 20:49 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159Цель проекта - оптимизация склада. Моя задача посчитать сколько времени у человека на руках накладные, если их несколько - необходимо посчитать период, указать какие накладные относятся к какому периоду. Терять накладные в недрах периода нельзя, т.к. статистическая/количественная составляющая будет утеряна. У вас как бы несколько задач. Интервалы занятости по сотрудникам и содержимое интервалов. Это удобнее делать разными запросами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 21:31 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
PizzaPizza, количество запросов совершенно не принципиально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 21:45 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, Вы можете дать побольше тестовых данных, что бы с разрывами было? Очень лень самому даты придумывать. для поиска непрерывных интервалов попробуйте вот такую петрушку: Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2018, 05:07 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159увы но не получается...Видимо у вас для некоторых граничных строк есть дубликаты по датам начала/конца. Попробуйте так: Код: sql 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.10.2018, 12:38 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, Картинки у вас - красивые. Но они мало чем могут помочь делу. Лучше приведите репрезентативный тестовый набор данных, иллюстрирующий проблемы, возникшие в предложенных решениях. Чтобы было на чем пытаться понять суть проблемы и предложить более правильные варианты... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 06:34 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159... Интервалы пересекаются ... ... собственно хотелось бы получить начало и конец периода где накладные пересекаются ... Для затравки - склейка" пересекающихся накладных в сплошные интервалы: Код: sql 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. Теперь рассказывайте, что дальше с этими данными вы хотите сделать? Какие накладные и куда прикрутить к полученным интервалам? Просто с ваших сбивчивых объяснений, разбавленных картинками - совсем не понятна суть затеянных манипуляций... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 07:41 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, Оконные функции не всегда благо. Как с точки зрения производительности, так и с точки зрения наглядности. Небольшой эксперимент Код: sql 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 10:14 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
invmОконные функции не всегда благо. Как с точки зрения производительности, так и с точки зрения наглядности.ни наглядность кода, ни его эффективность - не имеют смысла, если код возвращает "неправильные" данные. Для начала хотелось бы понять суть хотелки автора и претензии к результатам предложенных решений. А код был предложен из соображений "для общего развития" и "расширения кругозора"... В любом случае, без тестирования на данных, приближенных к реальным, тащить в продакт какой-бы-то-ни-было код из интернета (даже трижды наглядный и сто раз эффективный) - достаточно рисковая затея... ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 10:33 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, картинки вы имеете ввиду которые я нарисовал в 21718309 ? (остальные были таргетированы авторам запросов, убирал под спойлер, чтобы никого не смущали лишний раз...) Хочу задать соответствие накладн(ой|ых) интервалу. Я говорил что очень хочется сохранить id_wt. Для чего? В последствии закинуть все это в QlikView, вычислить "соседей" накладной/товара в пределах одного интервала, но это отдельная история. Познания в SQL не шибко большие в конструировании запросов. Благодаря вашим ответам узнал об интересной штуке over (partition by ...) и rows between unbounded preceding... Пойду учить матчасть. И вообще литературы толковой по алгоритмам SQL не нашел, есть либо справочники (польза как от телефонного) либо уровень "за 5 минут" что тоже не вселяет оптимизма. Не хочу сказать что должна быть "книга с готовыми решениями именно для тебя" но и между книжками "за 5 минут" и примерами откликнувшихся - пропасть. (Это комплимент на самом деле) Возвращаясь к топику: ваш пример, Анна, дает интервалы. Попробую еще более детально зонировать, добавлю склады, чтобы набить шишек и не выглядеть пришедшим на всё готовенькое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 11:13 |
|
||
|
И снова Пересекающиеся интервалы
|
|||
|---|---|---|---|
|
#18+
AR159, Вот даже не знаю что можно было бы сделать архитектурно для упрощения подобных выборок. Вроде все крайне просто: сущность, начало работы с ней, конец работы с ней, кто работал. Нормализация и все такое. Но диапазоны выбирать неудобно. Может быть поставить триггер на обновление таблицы и проверять есть ли у сотрудника другие незакрытые накладные и если нет, то помечать обновляемую как конец диапазона или какой то uid или хеш группы задавать пока не все закрыты? Или overthinking? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2018, 08:25 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39724732&tid=1688856]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
140ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 520ms |

| 0 / 0 |
