首頁 >資料庫 >mysql教程 >如何在Oracle中透過重置閾值執行條件求和?

如何在Oracle中透過重置閾值執行條件求和?

Patricia Arquette
Patricia Arquette原創
2024-10-29 18:53:30278瀏覽

How to Perform Conditional Summation in Oracle with a Resetting Threshold?

Oracle 中的條件求和:當限制超過15 時重置值

在Oracle 中,您可能會遇到需要對值進行條件求和的場景並在總和達到特定閾值時重設。例如,假設您的表中的資料如下所示:

A | 3 | 3
B | 7 | 10
C | 6 | 16  -- ====
D | 5 | 5
E | 9 | 14
F | 3 | 17  -- ====
G | 8 | 8

目標:編寫一個查詢來計算值的運行總和,每當總和超過 15 時將其重設為零。

使用 SQL MODEL 子句的解決方案

解決此問題的遞歸 SQL 的替代方法是使用 SQL MODEL 子句。語法看起來更複雜,但在某些情況下可以提供清晰度:

-- Create a temporary table for demonstration purposes
with test_data ( sort_col, addend ) as
( SELECT 'A', 3 FROM DUAL UNION ALL
 SELECT 'B', 7 FROM DUAL UNION ALL
 SELECT 'C', 6 FROM DUAL UNION ALL
 SELECT 'D', 5 FROM DUAL UNION ALL
 SELECT 'E', 9 FROM DUAL UNION ALL
 SELECT 'F', 3 FROM DUAL UNION ALL
 SELECT 'G', 8 FROM DUAL ),

-- Implementation of the conditional summation using MODEL clause
sorted_inputs ( sort_col, sort_order, addend, running_sum_max_15) as
( SELECT sort_col, row_number() over ( order by sort_col ) sort_order, addend, 0 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],
  running_sum_max_15[sort_order>1] =
          case when running_sum_max_15[CV(sort_order)-1] < 15 THEN
             running_sum_max_15[CV(sort_order)-1] ELSE 0 END+addend[CV(sort_order)]
)

結果:

+----------+--------+--------------------+
| 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 |
+----------+--------+--------------------+

此查詢有效地執行條件求和,當運行總和超過閾值15 時,將其重置為零。

以上是如何在Oracle中透過重置閾值執行條件求和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn