|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Всем добрый день. Помогите решить проблему. Есть таблица с данными: INSTRUCTION_NUMTOTAL_WEIGHT175.492249.176343.164412.210512.016612.6787116.592843.074980.6410100.1761150.5921263.24139.2821437.512159.3961646.1117204.61828.080199.2822027.36 Цель решения, сделать нарастающий итог по столбцу TOTAL_WEIGHT, сортируя по полю INSTRUCTION_NUM, и если сумма нарастающего итога <= 200, начинать суммировать заново со следующей строки, пример какой результат я хочу получить, в столбце желаемый результат и выделил жирным шрифтом, где должен быть обрыв расчета: INSTRUCTION_NUMTOTAL_WEIGHT Желаемый результат 175.49275.492249.176124.668343.164167.832412.210180.042512.016 192.058 612.67812.6787116.592129.27843.074 172.344 980.6480.6410100.176 180.816 1150.59250.5921263.24113.832139.282123.1141437.512160.626159.396 170.022 1646.11 46.11 17204.6 204.6 1828.08028.080199.28237.3622027.36 64.722 Буду очень благодарен за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 11:20 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Попробовал написать через рекурсивное cte (исходная таблица была сокращена): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 13:37 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Попробовал нарисовать... https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=abcadb7c36ee71c795155b2a8ebe9b2e (WHERE curgrp < 10 добавлен для принудительного обрывания рекурсии). Но непонятка - оконная SUM() в рекурсивной части даёт не тот результат, что ожидается... это вообще разрешается - оконные в рекурсии? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 16:17 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Забыл добавить, что последней строчкой надо написать: Код: sql 1.
, тогда не будет ограничения на длину таблицы. На 100'000 строк работает 1 сек, на 1'000'000 - 12 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 17:26 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
DanilaSP, Спасибо, все получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 18:12 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Akina, Спасибо, все получилось тоже ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 18:12 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 19:20 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Pata12kv, задача решается с помощью таблицы чисел без каких-либо громоздких вычислений, а способов формирования таблицы чисел - вагон и малая тележка, можно найти как здесь, так и в инете. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 01:26 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Владислав Колосов, Можно и без промежуточной таблицы. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Только это неправильно, обрыв должен быть не там. Сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 07:01 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Владислав Колосов, почему то у вашего решения результат не тот, который требуется в исходной формулировке. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 08:41 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
spenov, добавьте еще числа в таблицу чисел. Сформируйте ее как вам надо, догадаться не сложно по-моему. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 14:05 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Владислав Колосов, в строке 4 неправильное значение. должно быть 50, а у вас получается 10. если конечно я правильно угадал в какую колонку смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 14:45 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
spenov, возможно, я неправильно понял задачу, я предполагал, что вы хотите, чтобы нарастающий итог уменьшался кратно 200 при превышении границы. Тогда понадобится расчет нарастающего итога дважды, сначала для разбиения на секции, как в моем решении, а затем подсчет итога по каждой секции. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 18:42 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Владислав Колосов, я не имею цели доковыряться. задача интересная. я не понимаю как взятие по модулю может решить эту задачу. по мере накопления итогов появятся ошибки определения точек перехода. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2022, 19:14 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
DanilaSP, Хочу еще раз поблагодарить, все получилось как в вашем примере. Но столкнулся еще с одной сложностью. Есть два критерия это суммарный вес и объем, я думал у меня получится как в решении что вы предложили, добавить еще и объем, это означает, я начинаю суммировать по отдельности два столбца, объем и вес, и при достижении определенного значения (в примере 200 кг или объем 1,6), начинать суммировать заново с новой строки, но скрипт зависает. Как видно в примере, у меня есть объем и вес, я начинаю суммировать и на сумме третьей строки с четвертой, объем превышает допустимый 1,5, хотя вес еще позволяет добавлять, но мне уже нужно отсекать и начинать суммировать заново, так как я дошел до максимального объема, а вот на сумме строк 7 и 8мой, у меня уже вес превышает допустимый и я так же должен отсекать и начинать суммировать заново. INSTRUCTION_NUM TOTAL_WEIGHT TOTAL_VOL Подсчет Объем 1.5 Подсчет Вес 200 Отсчка1 75.492 0.5 0.5 75.492 2 49.176 0.7 1.2 124.668 3 43.164 0.2 1.4 167.832 14 12.21 0.4 0.4 12.21 5 12.016 0.2 0.6 24.226 6 12.678 0.1 0.7 36.904 7 125.5 0.1 0.8 162.404 18 43.074 0.5 0.5 43.074 9 80.64 0.5 1 123.714 10 50.3 0.3 1.3 174.014 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 18:29 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 21:48 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
Pata12kv, Код: 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.
результат с тестовыми данными nn grN grWt grVol wt vol wtGrT volGrT grT1 1 75,492 0,5 75.492 0.5 75.492 0.5 02 1 124,668 1,2 49.176 0.7 124.668 1.2 03 1 167,832 1,4 43.164 0.2 167.832 1.4 14 2 12,21 0,4 12.210 0.4 12.210 0.4 05 2 24,226 0,6 12.016 0.2 24.226 0.6 06 2 36,904 0,7 12.678 0.1 36.904 0.7 07 2 162,404 0,8 125.500 0.1 162.404 0.8 18 3 43,074 0,5 43.074 0.5 43.074 0.5 09 3 123,714 1 80.640 0.5 123.714 1.0 010 3 174,014 1,3 50.300 0.3 174.014 1.3 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 22:16 |
|
Работа с нарастающим итогом до определенного числа
|
|||
---|---|---|---|
#18+
invm, хотел такое решение... Спасибо за пример с FIRST_VALUE. Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 22:49 |
|
|
start [/forum/topic.php?fid=46&fpage=2&tid=1683823]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 232ms |
total: | 353ms |
0 / 0 |