Intereting Posts
Сводная таблица SQL с итогом столбцов и строк MYSQL: отображение пропущенных записей после LOAD DATA INFILE? Доступ к SQL – создание строки для каждых 10 строк и остатка в группе Удаление неназванных ограничений Заказ По запросу игнорирует знаки препинания ORA-00937: не групповая групповая функция Как сделать запрос в Postgres для группировки записей по месяцам, они были созданы? (: created_at столбец datetime) Pl / SQL- Получить имена столбцов из запроса Отображение столбцов в виде строк в SQL Server 2005 Oracle 11g: Unpivot несколько столбцов и имя столбца Разработка базы данных для отношений «многие ко многим» с ограничениями Ошибка: неверная попытка вызова Чтение, когда считыватель закрыт после цикла while? Получить идентификатор записи, только что вставленной в базу данных Java DB (Derby) SQL: Почему значения NULL отфильтрованы внутри этого предложения where? Возвращение имен столбцов из таблицы в SQLite с использованием Java GUI

Как рекурсивно вычислять отношение оставшихся сумм на основе округленных значений из предыдущих строк?

Мне нужно разделить 1 сумму на 2 поля . Я знаю, что суммарные суммы полученных полей = отношение для разделения первой строки, но мне нужно округлить полученные суммы и только затем вычислить отношение для следующей строки (так что общая сумма округленных значений будет правильной).

введите описание изображения здесь

Как написать этот алгоритм в Oracle 10g PL / SQL? Мне нужно проверить некоторые перенесенные данные. Вот что я придумал (до сих пор):

with temp as ( select 1 id, 200 amount, 642 total_a from dual union all select 2, 200, 642 from dual union all select 3, 200, 642 from dual union all select 4, 200, 642 from dual union all select 5, 200, 642 from dual ) select temp2.*, remaining_a / remaining_amount ratio, round(amount * remaining_a / remaining_amount, 0) rounded_a, round(amount - amount * remaining_a / remaining_amount, 0) rounded_b from ( select temp.id, temp.amount, sum(amount) over ( order by id range between current row and unbounded following ) remaining_amount, case when id=1 then total_a /* else ??? */ end remaining_a from temp ) temp2 

Обновление . Если вы не видите изображение выше, ожидаемые значения rounded_A :

 1 128 2 129 3 128 4 129 5 128 

Вот мое предложение. Это не значит, что вы хотите. , , по моим расчетам, 129 не доходят до третьей строки.

Идея состоит в том, чтобы добавить больше столбцов. Для каждой строки вычислите расчетный раскол. Затем следите за накопленной долей. Когда остаток спермы превышает целое число, затем увеличивайте количество A на 1. Когда у вас есть сумма A, вы можете рассчитать остаток:

 WITH temp AS ( SELECT 1 id, 200 amount, 642 total_a FROM dual UNION ALL SELECT 2, 200, 642 FROM dual UNION ALL SELECT 3, 200, 642 FROM dual UNION ALL SELECT 4, 200, 642 FROM dual UNION ALL SELECT 5, 200, 642 FROM dual ) select temp3.*, sum(estArem) over (order by id) as cumrem, trunc(estA) + (case when trunc(sum(estArem) over (order by id)) > trunc(- estArem + sum(estArem) over (order by id)) then 1 else 0 end) from (SELECT temp2.*, trunc(Aratio*amount) as estA, Aratio*amount - trunc(ARatio*amount) as estArem FROM (SELECT temp.id, temp.amount, sum(amount) over (ORDER BY id range BETWEEN CURRENT ROW AND unbounded following ) remaining_amount, sum(amount) over (partition by null) as total_amount, max(total_a) over (partition by null)as maxA, (max(total_a) over (partition by null) / sum(amount) over (partition by null) ) as ARatio FROM temp ) temp2 ) temp3 

Это не проблема раздела. Это целочисленная задача аппроксимации.

Если вы округляете значения, а не обрезаете их, вам нужно немного подправить логику.

  trunc(estA) + (case when trunc(sum(0.5+estArem) over (order by id)) > trunc(0.5 - estArem + sum(estArem) over (order by id)) 

Это утверждение изначально просто искало совокупный остаток, проходящий через целочисленное пороговое значение. Это должно делать округление вместо усечения.