Я пытаюсь собрать код SQL, который может распространять определенное количество среди ведер с ограниченной емкостью для этого количества в определенном порядке, но в отдельных транзакциях. См. Ниже, например.Выделение величин для разных ковшей с использованием SQL
У меня есть 2 ведра, каждый с определенной мощности (целочисленные):
bucket capacity
1 100
2 50
Я некоторые величины, которые будут bucketed в ряде сделок:
transaction quantity
1 50
2 60
3 20
4 40
Я хочу следующий результат после запуска кода SQL, который должен содержать номер транзакции и рассказать мне, сколько каждого ведра могло удерживать это количество. Ковши должны быть заполнены в порядке убывания числа ковшей, а в порядке убывания количества сделок:
transaction quantity_bucketed bucket_id overage
1 50 1 0
2 50 1 0
2 10 2 0
3 20 2 0
4 20 2 20
Если нет больше ведра, и есть еще некоторое количество, чтобы быть bucketed, он должен идти к " overage ", как в приведенном выше примере.
Не могли бы вы немного объяснить, что делает каждая часть SQL? А именно 'with',' over', 'xact',' slot', 'unit' и' generate_series'. – veggie1
Итак, я получил эту работу для своего приложения, однако она очень медленно подходит для любых «больших» количеств (например, для создания большого количества строк потребуется миллионы строк). Есть ли способ, которым вы можете думать о битве с оптимизировать этот запрос? – veggie1
@ veggie1 ... только если чрезмерная или потерянная емкость очень однобокая, и вы можете удалить много строк, выполнив LEFT или RIGHT join, а затем просто подсчитав оставшиеся строки. Я не собираюсь изменять пример для этого, потому что это просто сделало бы его очень трудным для чтения, чтобы разрешить угловой случай. –