Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть такая задачка. Есть первая таблица - Таблица расчетов. Номер расчета Код ТТ SKU Дата расчета Кол-во недельНомер расчета1 00001 SKU1 2018-02-08 1Номер расчета1 00001 SKU2 2018-02-08 1Номер расчета1 00002 SKU1 2018-02-08 1Номер расчета1 00002 SKU2 2018-02-08 1Номер расчета2 00001 SKU1 2018-02-08 1Номер расчета2 00003 SKU1 2018-02-08 1Номер расчета2 00003 SKU2 2018-02-08 1 Есть вторая таблица - Таблица мероприятий Код мероприятия Код ТТ SKU Дата начала мероприятия Дата окончания мероприятия1 00001 SKU1 2018-02-02 2018-02-032 00001 SKU1 2018-02-05 2018-02-063 00001 SKU2 2018-02-01 2018-02-034 00003 SKU1 2018-02-02 2018-02-02 Каждый [Номер расчета] + [Код ТТ] + [SKU] имеет свой диапазон периода: начиная [Дата расчета] - ([Количество недель] * 7 -1) и заканчивая на дату расчета. Но следует учесть, если у [Номер расчета] + [Код ТТ] + [SKU] в периоде были дни с мероприятиями в соответствии второй таблицы, то начальный период сдвигается на количество этих же дней назад. Например, возьмем первую строку, [Номер расчета1]+[00001]+[SKU1] . [Дата расчета] = 8.02.2018. Для этой строки максимальная дата это 8.02.2018. Минимальная дата равно [Дата расчета] - ([Количество недель] * 7 -1) , то есть 8.02.2018 - (1*7 - 1) = 02.02.2018. Поскольку в этом периоде были мероприятия 2 и 3 числа, а также 5 и 6 февраля 2018 для соответствующей [Код ТТ] + [SKU], то всего дней 4. Это [Количество дней сдвига]. Далее [Минимальная дата со сдвигом] = [Минимальная дата] - [Кол-во дней для сдвига], то есть 8.02.2018 - 4 = 29.01.2018. Аналогично для остальных строк первой таблицы. Потом из всех строк находим минимальную и максимальную дату. Это нужно для того, чтобы знать за какой период потом выгружать данные (отгрузки, продажи, возвраты и другие показатели) исходя первой таблицы. Написал запрос. Работает так как надо. Но для простой задачи получился длинный запрос. Чую что можно как то покороче написать, но пока не нашел решение, алгоритм. А в рабочей базе первые и вторые таблицы большие. Следовательно, будет тормозить очень сильно. Как можно написать запрос более оптимальнее и короче для данной задачи? SQL-запрос с исходными данными Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 13:45 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
With cte as ( Select a.[Номер расчета] ,a.[Код ТТ] ,a.SKU ,dateadd(dd,((a.[Количество недель]*7)-1)*-1,a.[Дата расчета]) as Start_data ,a.[Дата расчета] as mx_dd ,sum(datediff(dd,b.[Дата начала мероприятия],b.[Дата окончания мероприятия])+1) as sdvig from @ТаблицаРасчетов a left join @ТаблицаМероприятий b on a.[Код ТТ] =b.[Код ТТ] and a.SKU = b.SKU and b.[Дата начала мероприятия] between dateadd(dd,((a.[Количество недель]*7)-1)*-1,a.[Дата расчета]) and a.[Дата расчета] group by a.[Номер расчета] ,a.[Код ТТ] ,a.SKU ,dateadd(dd,((a.[Количество недель]*7)-1)*-1,a.[Дата расчета]) ,a.[Дата расчета]) Select min(dateadd(dd,isnull(sdvig,0)*-1,start_data)) as min_dd ,max(mx_dd) as max_dd from cte ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:42 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
ferzmikk, Без рекурсии С учетом что интервалы мероприятий пересекаются: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:09 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
assmsk, О, супер! Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:27 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
Kopelly, Спасибо! Пока не могу запустить, так как у меня стоит Microsoft SQL Server 2008. Запущу на другом компе. Из за этого пишет "Функции параллельного хранилища данных (PDW) не включены.". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:28 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
Можно еще добавить в коде присвоение в переменные Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:35 |
|
||
|
Минимальная и максимальная дата
|
|||
|---|---|---|---|
|
#18+
KopellyС учетом что интервалы мероприятий пересекаются: ...В данной задаче пересечения не должны быть. У пары ТТ+SKU в один день либо есть мероприятие, либо нет. В один день больше одного мероприятия у ТТ+SKU не может быть. Хотя не помешает в запросе дополнительную проверку прописать. Но Ваш алгоритм так интересен и возможно использовать для решения последующих подобных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:45 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39603004&tid=1690258]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 448ms |

| 0 / 0 |
