Denodo SQL中如何用market_value总和计算每行Contribution列?
Denodo下计算全局总和实现Contribution列的SQL方案
问题背景
现有数据库表包含ID、Classification、emissions、market_value字段,数据如下:
| ID | Classification | emissions | market_value |
|---|---|---|---|
| 1 | Type A | 0.04 | 5.67 |
| 2 | Type B | 0.01 | 6.12 |
需要新增Contribution列,计算公式为:(emissions * market_value) / SUM(market_value),其中SUM(market_value)是全局总和,预期结果如下:
| ID | Classification | emissions | market_value | contribution |
|---|---|---|---|---|
| 1 | Type A | 0.04 | 5.67 | 0.192 |
| 2 | Type B | 0.01 | 6.12 | 0.005 |
此前尝试两种方法失败:
- SELECT子句嵌套子查询取总和,Denodo不支持该写法;
- GROUP BY分组计算时,
SUM(market_value)仅返回分组内总和,无法得到全局值。
可行SQL实现方法
方法1:使用窗口函数(推荐)
Denodo支持窗口函数,通过SUM(market_value) OVER ()可直接获取全局总和,无需分组:
SELECT ID, Classification, emissions, market_value, ROUND((emissions * market_value) / SUM(market_value) OVER (), 3) AS contribution FROM your_table_name;
说明:OVER ()表示窗口范围覆盖整个数据集,SUM(market_value)会计算全局总和,用ROUND函数保留三位小数匹配预期结果。
方法2:交叉连接全局总和子查询
如果窗口函数存在兼容问题,可通过交叉连接单独计算全局总和的子查询实现:
SELECT t.ID, t.Classification, t.emissions, t.market_value, ROUND((t.emissions * t.market_value) / total.total_market, 3) AS contribution FROM your_table_name t CROSS JOIN (SELECT SUM(market_value) AS total_market FROM your_table_name) total;
说明:子查询先算出全局market_value总和,再通过交叉连接将该值与原表每一行关联,完成计算。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

