Oracle中使用窗口函数按program分区求和contractrate/rate是否可行?
当然可以实现!
你完全可以用窗口函数来按program分区,计算每个分区内contractrate/rate的求和值。下面是具体的实现步骤和示例:
1. 原数据表
先把你提供的数据整理成更清晰的表格:
| id | rate | contractrate | program |
|---|---|---|---|
| 1 | 100 | 100 | low |
| 2 | 100 | 50 | low |
| 3 | 250 | 250 | Med |
| 3 | 250 | 200 | Med |
| 4 | 500 | 500 | High |
| 5 | 500 | 400 | High |
2. 核心SQL语句
这里以标准SQL为例(不同数据库语法略有差异,但核心逻辑一致):
SELECT id, rate, contractrate, program, -- 计算当前行所属program分区的contractrate/rate总和 SUM(contractrate / rate) OVER (PARTITION BY program) AS total_ratio FROM your_table_name;
3. 语句解释
SUM(contractrate / rate):先计算每一行的contractrate与rate的比值,再对这些比值求和OVER (PARTITION BY program):指定按program字段进行分区,求和操作只会在同一个program的组内执行
4. 执行结果示例
运行上述SQL后,你会得到如下结果:
| id | rate | contractrate | program | total_ratio |
|---|---|---|---|---|
| 1 | 100 | 100 | low | 1.5 |
| 2 | 100 | 50 | low | 1.5 |
| 3 | 250 | 250 | Med | 1.8 |
| 3 | 250 | 200 | Med | 1.8 |
| 4 | 500 | 500 | High | 1.8 |
| 5 | 500 | 400 | High | 1.8 |
(计算说明:low分区的比值是100/100 + 50/100 = 1 + 0.5 = 1.5;Med分区是250/250 + 200/250 = 1 + 0.8 = 1.8;High分区是500/500 + 400/500 = 1 + 0.8 = 1.8)
小提示
如果你的数据库对整数除法有特殊处理(比如MySQL中整数相除会直接取整),可以先将字段转为浮点型再计算,比如写成SUM(CAST(contractrate AS FLOAT)/rate)。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

