首页  >  文章  >  数据库  >  如何在 Oracle 中使用重置阈值计算条件 SUM?

如何在 Oracle 中使用重置阈值计算条件 SUM?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 17:22:30960浏览

How to Calculate a Conditional SUM in Oracle with a Reset Threshold?

Oracle 数据库中的条件 SUM

Oracle 为条件聚合提供了强大的功能,包括条件 SUM 计算。本文解决了执行此类 SUM 的挑战,有一个特定要求:当累计值超过 15 时重置累计值。

问题陈述

目标是计算对一系列值进行条件求和,其中每当达到或超过 15 时,求和都会重置为零。此聚合会产生按阈值划分的一系列求和

解决方案:利用 MODEL 子句

虽然递归 SQL 是一种可行的方法,但 SQL MODEL 子句提供了一种替代方案,可以增强可读性并简化执行

<code class="sql">-- Create a table to represent the sample data
CREATE TABLE test_data ( sort_col VARCHAR2(1), addend NUMBER );
-- Insert sample data
INSERT INTO test_data (sort_col, addend) VALUES ('A', 3), ('B', 7), ('C', 6), ('D', 5), ('E', 9), ('F', 3), ('G', 8);

-- Begin the actual solution
WITH sorted_inputs AS (
  SELECT sort_col,
         ROW_NUMBER() OVER (ORDER BY sort_col) AS sort_order,
         addend,
         0 AS running_sum_max_15  -- Initialize running sum to zero
  FROM test_data
)
SELECT sort_col,
       addend,
       running_sum_max_15
FROM sorted_inputs
MODEL
DIMENSION BY (sort_order)
MEASURES (sort_col, addend, running_sum_max_15)
RULES UPDATE (
  running_sum_max_15[1] = addend[1],  -- Set initial running sum to the first addend
  running_sum_max_15[sort_order > 1] =  -- Calculate running sum for subsequent rows
  CASE
    WHEN running_sum_max_15[CV(sort_order) - 1] < 15 THEN
      running_sum_max_15[CV(sort_order) - 1]  -- Continue running sum if below threshold
    ELSE
      0  -- Reset running sum if threshold is reached or exceeded
  END + addend[CV(sort_order)]  -- Add current addend to running sum
);</code>

结果

查询产生以下输出:

<code class="sql">+----------+--------+--------------------+
| SORT_COL | ADDEND | RUNNING_SUM_MAX_15 |
+----------+--------+--------------------+
| A        |      3 |                  3 |
| B        |      7 |                 10 |
| C        |      6 |                 16 |
| D        |      5 |                  5 |
| E        |      9 |                 14 |
| F        |      3 |                 17 |
| G        |      8 |                  8 |
+----------+--------+--------------------+</code>

显然,条件 SUM 计算正确,达到 15 后重新开始累计。

以上是如何在 Oracle 中使用重置阈值计算条件 SUM?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn