首页  >  文章  >  数据库  >  如何在Oracle中通过重置阈值执行条件求和?

如何在Oracle中通过重置阈值执行条件求和?

Patricia Arquette
Patricia Arquette原创
2024-10-29 18:53:30174浏览

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