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 後重新達到15 後重新開始。
以上是如何在 Oracle 中使用重置閾值計算條件 SUM?的詳細內容。更多資訊請關注PHP中文網其他相關文章!