Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#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. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. Собственно сама выборка которую я сделал. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Суть, у нас есть диапазоны дат. Некоторые из них между собой пересекаются, некоторые нет, некоторые лежат друг в друге и т.д. и т.п. Нужно найти максимальный и минимальный даты этих ЦЕПОЧЕК пересечений. Что не делает мой код и в чем вопрос: У нас есть диапазоны: 10-12 11-16 15-18 В конце у меня должно это сгруппироваться в одну запись: 10-18 Тобишь минимальная дата начала - 10 и максимальная дата конца - 18(потому что диапазон продолжается). И этого мой код не сделает из-за условий Cross Apply. Дополнительная информация по задаче: Вложенность подобных цепочек вряд-ли будет выше 10-13ти. Размеры исходной таблицы(SourceData) порядка 800+ тысяч записей, тобишь большие объемы, выборка строго индексирована. Очень высокие требования к быстродействию, он должен молотить всю эту выборку быстрее чем за 4 минуты на 800 тысяч строк. В таблице множество разных CI и множество пересечений внутри, выборку из 200 тысяч мой текущий запрос сводит к порядка 80 тысячам записей! Мои идеи - напрашивается рекурсия, но я не понимаю условия ее ограничения, не понимаю что ее ограничивает. Пожалуйста помогите решить проблему нахождения Min и Max дат вот таких цепочек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 19:19 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Вот так выглядит работа моего текущего кода на графиках. Крестик то что он не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 19:42 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumata, для начала перевела вашу простыню кода в табличку(надеюсь, что не ошиблась) 2019.01102019.0114 2019.01122019.0117 2019.01162019.0120=11 2018.10032018.1004 2018.10032018.1005 =3 2018.10072018.1009 2018.10082019.1010 =5 2017.10102017.1014 =5 2017.05012017.0503 2017.05022017.0506 2017.05052017.0520 =20 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:01 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Ну что-то такого плана, любая вложенность и количество пересечений, надо только посмотреть что там с планом и поколдовать над индексами :) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:12 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumata, DnRumataВот так выглядит работа моего текущего кода на графиках. Крестик то что он не делает.в крестике на диаграме 3 диапазона, всё из 2х и одного покрыто решением. если делать решение в 2 прохода - то изначально 3-х диапазонные обьединения (а после первого прохода уже 2х-диапазонные) тоже будут покрыты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:15 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumata, с ms sql не работала, а в коде сделала бы через массив примерно так(макет) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:17 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Докатились. Неучи. 1. Начало = дата которая НИЧЕМ не перекрыта. 2. Конец = дата которая НИЧЕМ не перекрыта. 3. Начало предшествует концу. 4. Вот и фсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:34 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
aleks222, Ога, ну и как узнать что дата ничем не перекрыта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:44 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
fallenyasha, Сейчас погляжу, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:45 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКА, 2019-01-10 = 20190110 Это даты. Код рабочий и спокойно запускается на ms sql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:47 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
vikkiv, Потому и подумал о рекурсии. Проблема в том что проходов может быть порядка 10ти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:50 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumata, тогда надо профайлинг данных делать и искать оптимальный способ т.к. теоретически можно подойти и с другого конца - искать пробелы между диапазонами когда ясно будет чего меньше - от туда уже копать вариант подходящий по производительности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 20:55 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumataaleks222, Ога, ну и как узнать что дата ничем не перекрыта? Может сразу в управдомы преквалифицироваиться? Код: 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. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:01 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:11 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Слегка лоханулся... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:14 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
vikkivискать пробелы между диапазонами на этом и основан мой пример в коде --немного наврала с if...else...endif результат за 1 проход , причем можно подсчитать количество попаданий в интервал и график построить по интервалу Код: vbnet 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:16 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#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. Садись, неуд. При наличии двух полностью совпадающих диапазонов это обломается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:17 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#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. Не могли бы вы объяснить, как работает подобный код? Что возвращает 1ая и 2ая CTE? И DenseRank - он на чем основывается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:23 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
aleks222Слегка лоханулся... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 2017-10-01 2017-09-13 - мягко говоря не то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:31 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКАvikkivискать пробелы между диапазонами на этом и основан мой пример в коде --немного наврала с if...else...endif результат за 1 проход , причем можно подсчитать количество попаданий в интервал и график построить по интервалу Код: vbnet 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. В коде я бы давно сделал, но CRT создать не могу. Изначально выборка вообще помощь другому отделу Sharepoint щиков. Ну и циклом лопатить 800к строк определенно не круто ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:39 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
vikkivDnRumata, тогда надо профайлинг данных делать и искать оптимальный способ т.к. теоретически можно подойти и с другого конца - искать пробелы между диапазонами когда ясно будет чего меньше - от туда уже копать вариант подходящий по производительности Нет пробелы искать не стоит, по одной простой причине: Диапазоны между собой не связаны. Тобишь может быть 2019-01-10 - 2019-01-11 2019-01-30 - 2019-02-05 И это 2 раздельных строки. Фишка в том что диапазонов дохрена + дублирующиеся данные внутри, дубликаты я могу почистить заранее. У меня проиндексировано и группировку вывел ибо быстрее чем Top 1 от сортировки(точнее легче индексом покрыть, из-за того что работа на времянка плодить их в реалтайме не хочется, ибо скорость -_-) Разные CI у каждого свои диапазоны, они могут совпадать между разными CI. У меня голова пухнет, 2 выборки в комментах рабочие, но мне нужно время чтобы полностью понять как они работают ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:44 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Был не прав со своим решением, там косяк с интервалами поглощающими другие. Касательно решения invm: вроде бы как есть ошибка во второй CTE, там dense_rank нужен с сортировкой по DateTimeCompleted Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. И возможно что distinct отработает быстрее чем группировка, надо смотреть на реальных объемах данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:47 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
Работает сие так: CTE1 вытаскивает все DateTimeStarted не попадающие ни в какие другие интервалы CTE2 вытаскивает все DateTimeCompleted не попадающие ни в какие другие интервалы dense_rank() нумерует строки с разбивкой по CI и сортировкой по дате, при том что для каждой уникальной даты будет проставлен новый последовательный номер Например в первой CTE 2017-05-01 1 2017-10-10 2 2018-10-03 3 2018-10-03 3 2018-10-07 4 А далее по сути надо вытащить уникальные записи и сджойнить, уникальность либо группировкой, либо дистинктом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 21:52 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
DnRumataЧто возвращает 1ая и 2ая CTE? И DenseRank - он на чем основывается?Выполните отдельно запросы из CTE и все увидите. А вообще поищите по форуму темы по "объединение интервалов", "непрерывный интервал" и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 22:00 |
|
||
|
Объединение пересекающихся диапазонов дат.
|
|||
|---|---|---|---|
|
#18+
fallenyasha, Сейчас проверил, вроде норм у INVM. Косяк нашел, поправил, но на ранках шустрее летает и план поприятней. Спасибо за разъяснение, как дорвусь до боевых данных проверю, тобишь в понедельник. Наверное придется слегка перелопатить индексы, но с этим уже разберусь. Огромное спасибо ребят, если снова всплывет отпишу, хотя надеюсь сам смогу починить :З ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2019, 22:04 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39806995&tid=1687899]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 388ms |

| 0 / 0 |
