|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Тривиальная казалось бы задача, но как сделать без цикла/курсора не представляю. Дано: 1. Таблица ячеек с товаром: Код: sql 1. 2. 3. 4. 5. 6. 7.
2. Таблица типоразмеров палет, в которой хранится вместимость каждого типоразмера Код: sql 1. 2. 3. 4. 5.
В результате надо получить сколько палет и какого типоразмера нужно для выборки товара из каждой ячейки так, чтобы остаток в ячейке был минимальным. Для приведенного примера это будет таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 16:32 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Oblom, Версию сервера скажите Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 16:35 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
запомнившаяся фраза из книженции Microsoft® SQL Server® 2008 T-SQL Fundamentals by Itzik Ben-Gan Another example of when you should consider cursors is when your set-based solution performs badly and you exhaust your tuning efforts using the set-based approach. As I mentioned, set-based solutions tend to be much faster, but in some cases the cursor solution is faster. Those cases tend to be calculations that, if done by processing one row at a time in certain order, involve much less data access compared to the way SQL Server currently (in SQL Server 2008 and previous versions) optimizes corresponding set-based solutions. One such example is running aggregates . I provided a set-based solution to running aggregates using subqueries in Chapter 4, "Subqueries," in the section "Running Aggregates." Optimization is outside the scope of this book, so I won't go into detail here regarding why the cursor solution to running aggregates is currently more efficient than the set-based solution . When you feel ready to deal with optimization aspects of T-SQL querying, you can find details in Inside Microsoft SQL Server 2008: T-SQL Querying (Microsoft Press, 2009). чисто к тому, что может, курсором оно и лучше ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 16:47 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
kalimbaOblom, Версию сервера скажите Код: sql 1.
Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 17:17 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
o-oзапомнившаяся фраза из книженции Microsoft® SQL Server® 2008 T-SQL Fundamentals by Itzik Ben-Gan Another example of when you should consider cursors is when your set-based solution performs badly and you exhaust your tuning efforts using the set-based approach. As I mentioned, set-based solutions tend to be much faster, but in some cases the cursor solution is faster. Those cases tend to be calculations that, if done by processing one row at a time in certain order, involve much less data access compared to the way SQL Server currently (in SQL Server 2008 and previous versions) optimizes corresponding set-based solutions. One such example is running aggregates . I provided a set-based solution to running aggregates using subqueries in Chapter 4, "Subqueries," in the section "Running Aggregates." Optimization is outside the scope of this book, so I won't go into detail here regarding why the cursor solution to running aggregates is currently more efficient than the set-based solution . When you feel ready to deal with optimization aspects of T-SQL querying, you can find details in Inside Microsoft SQL Server 2008: T-SQL Querying (Microsoft Press, 2009). чисто к тому, что может, курсором оно и лучше Я таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 17:19 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
OblomЯ таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :) у вас же 2012 сервер, какие курсоры http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 17:34 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
ShakillOblomЯ таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :) у вас же 2012 сервер, какие курсоры http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals О SUM() OVER() в 12-ом сиквеле я тоже в курсе, но как его пришпилить к этой задаче... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 17:53 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
OblomShakillпропущено... у вас же 2012 сервер, какие курсоры http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals О SUM() OVER() в 12-ом сиквеле я тоже в курсе, но как его пришпилить к этой задаче... так прямо и пришпильте и про order by в over()не забудьте ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 17:57 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 19:24 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
рекурсивный CTE прикрутить при большом желании можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2013, 19:52 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 04:17 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Bator, Вы из первой ячейки не весь товар вынули. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 07:14 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Oblom, http://www.sql-tutorial.ru/ru/book_running_totals.html http://tsqlmag.blogspot.ru/2013/03/blog-post_611.html ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 08:31 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
OblomВ результате надо получить сколько палет и какого типоразмера нужно для выборки товара из каждой ячейки так, чтобы остаток в ячейке был минимальным . задача о рюкзаке? тогда вопрос: количество типоразмеров палет заранее известно и фиксировано? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 09:14 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Shakillrunning-totals Мистер Хенкипро order by в over()не забудьте Алексей Куренковrunning_totals Присоединяюсь к вопросу ТСа: как это пришпилить к поставленной задаче? Правда, очень интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 09:24 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Гость333Правда, очень интересно.я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 09:29 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
ShakillГость333Правда, очень интересно.я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10. Я тоже среагировал на накопительный итог в теме а много буков не читал. Вообще задача из множества задач линейного программирования. Решается симплекс-методом через матричные вычисления. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 10:25 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Гость333, 1. В условиях задачи "чтобы остаток в ячейке был минимальным" 2. Если нужно выбрать все, то нужно добавить перед DELETE: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 10:39 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Мистер ХенкиShakillпропущено... я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10. Я тоже среагировал на накопительный итог в теме а много буков не читал. Вообще задача из множества задач линейного программирования. Решается симплекс-методом через матричные вычисления. Еще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:06 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Мистер ХенкиЕще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат.размеры минимальной палеты могут быть не кратны остальным, и тогда уже нет очевидного решения в общем случае. я задачу понял как "выбрать из ячейки максимальное количество товара полными палетами" ну и можно предположить, что вторичная цель - минимизировать количество палет ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:15 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
ShakillМистер ХенкиЕще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат.размеры минимальной палеты могут быть не кратны остальным, и тогда уже нет очевидного решения в общем случае. я задачу понял как "выбрать из ячейки максимальное количество товара полными палетами" ну и можно предположить, что вторичная цель - минимизировать количество палет если есть критерий минимизации количества палет то вот, например Код: sql 1. 2. 3. 4. 5. 6. 7.
оптимальный ответ 1 палета первого типа и 3 палеты 3 типа(полностью выбрана ячейка и количество палет минимально). даже если возьмем дважды модифицированное решение Bator, то оно не выдаст такого результата, хотя конечно ячейку выберет полностью. Но такие же неоптимальные результаты можно получать тупо деля вместимость ячейки на вместимость самой маленькой палеты, тогда никакие циклы вообще не понадобятся. Извиняюсь что я со своей стороны не могу предложить конструктива, но задача вычислительная и средствами TSQL, на мой взгляд, туговато будет решатся. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:28 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Мистер Хенки, если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:39 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
Oblom, может так? Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 11:41 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
ShakillМистер Хенки, если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия. тогда это cross join количество палет Х тип палет Х ячейки. Выбираем так чтоб покрывалась ячейка и количество палет в разрезе ячейки было минимальным. Как то так. Но декартово произведение трех множество, причем количество палет зависит от вместимости ячейки. Наверное учоные не просто так придумывали симплекс метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 12:05 |
|
Задача на накопительный итог
|
|||
---|---|---|---|
#18+
ShakillМистер Хенки, если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия. Набор типоразмеров не фиксирован и может меняться, именно для этого он вынесен в таблицу. И да, мой косяк в формулировке: нужно реализовать "жадный" алгоритм, то есть минимальный остаток должен получиться минимальным числом палет. Проще говоря: сначала выбирается весь товар на самые вместительные палеты, потом на менее вместительные и так далее. Палеты заполняются только полностью. Итого 305 = 240 (PaletTypeId = 1) + 50(PaletTypeId = 2) + 10 (PaletTypeId = 3) + 5 (остаток). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2013, 12:18 |
|
|
start [/forum/topic.php?fid=46&msg=38421175&tid=1704995]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 261ms |
0 / 0 |