Select语句将任意数据划分为总计为特定值的存储桶

时间:2016-05-28 17:52:38

标签: sql oracle

Oracle数据库中是否有办法将一定数量的资金分成几个部分,然后确保资金总额等于单个SELECT声明的初始资金?

可能是聚合函数的一些奇特组合?

例如:我们有100美元和3个时间段。我需要查询结果像

(33.33, 33.33, 33.34)

所以最后一个值平衡了那里的一切。

示例数据:

  1. 期间开始数据01/01/2015
  2. 期间结束日期01/01/2016
  3. 总量121吨
  4. 我需要SQL命令在所有月份之间输出均匀分布的总音量,所以我到最后:

    1月 - 10日 2月10日 ... 11月10日 12月11日

2 个答案:

答案 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