Oracle数据库中是否有办法将一定数量的资金分成几个部分,然后确保资金总额等于单个SELECT
声明的初始资金?
可能是聚合函数的一些奇特组合?
例如:我们有100美元和3个时间段。我需要查询结果像
(33.33, 33.33, 33.34)
所以最后一个值平衡了那里的一切。
示例数据:
我需要SQL命令在所有月份之间输出均匀分布的总音量,所以我到最后:
1月 - 10日 2月10日 ... 11月10日 12月11日
答案 0 :(得分:1)
如果您有一个时间表表,那么只需使用窗口函数:
select 100.0 / count(*) over () as bucket_amount
from buckets b;
请注意,这相当于所有三个,所以没有33.34。它可以为此目的进行调整,但您确实需要提供样本数据和所需结果。
答案 1 :(得分:0)
<强>查询强>:
SELECT month,
FLOOR( lvl * volume / num_months ) -
FLOOR( (lvl - 1) * volume / num_months ) AS bucket
FROM (
SELECT volume,
FLOOR( MONTHS_BETWEEN( end_month, start_month ) ) AS num_months,
ADD_MONTHS( start_month, LEVEL - 1 ) AS month,
LEVEL AS lvl
FROM (
SELECT 121 AS volume,
DATE '2015-01-01' AS start_month,
DATE '2016-01-01' AS end_month
FROM DUAL
)
CONNECT BY ADD_MONTHS( start_month, LEVEL - 1 ) < end_month
);
<强>输出强>:
MONTH BUCKET
------------------- ----------
2015-01-01 00:00:00 10
2015-02-01 00:00:00 10
2015-03-01 00:00:00 10
2015-04-01 00:00:00 10
2015-05-01 00:00:00 10
2015-06-01 00:00:00 10
2015-07-01 00:00:00 10
2015-08-01 00:00:00 10
2015-09-01 00:00:00 10
2015-10-01 00:00:00 10
2015-11-01 00:00:00 10
2015-12-01 00:00:00 11