如何在不使用`GROUP BY`的情况下进行聚合?

App*_*rew 1 sql oracle group-by aggregate-functions

我有如下查询

SELECT a.*, b.*

(SELECT ATTR1, ATTR2, sum(QUANTITY) AS TOTAL_QTY,
ATTR3 FROM TABLE_A
WHERE ATTR4 > 0
GROUP BY ATTR1, ATTR2, ATTR3) a,

TABLE_B b

WHERE a.ATTR1 = b.ATTR1
AND a.ATTR2 = b.ATTR2
Run Code Online (Sandbox Code Playgroud)

GROUP BYATTR1需要计算正确的TOTAL_QTY,但唯一的原因是我将其他属性分组,因为Oracle要求if GROUP BY子句存在,那么所有SELECT属性也应该在GROUP BY子句中.

这意味着每次我需要Table_A中的此查询中的属性时,我也需要将其放入GROUP BY.这不仅看起来很丑陋,而且可能会产生性能影响,也许会产生不可预见的副作用.

如何TOTAL_QTYATTR1没有GROUP BY子句的情况下重写上面的查询来计算每个组?

Xop*_*ter 8

使用Oracle分析功能.将内联视图更改为table_a:

select attr1,
       attr2,
       sum(quantity) over (partition by attr1 order by attr1) as total_qty,
       attr3
from   table_a
where  attr4 > 0
Run Code Online (Sandbox Code Playgroud)

这可能需要调整一下,但这是基本的想法.

  • +1"内联聚合"技术也适用于PostgreSQL和SQL Server 2005+ (2认同)