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中文网其他相关文章!