在解释CTE的一些概念时,有人问了一个可爱的问题..我们可以找到行的乘法吗,而我们总是SUM()从新手开始集中精力。那给了我一个想法!仅使用SQL是否有可能。我还考虑了我们甚至可以支持的最大精度,因为该产品可能非常庞大。
SUM()
话虽如此,我们不能编写自己的聚合函数。(可以吗?)我在想仅使用SQL就有可能。
我想到的2*3就像是自己添加2,3次。.但是当集合很大时..由于繁琐,我无法实现。
2*3
另一个可能是log (a+b) = log a * log b;和Anti logarithm,为您提供结果。这是我设法做出的回应。对于Oracle,我将使用的功能EXECUTE IMMEDIATE。
log (a+b) = log a * log b;
Anti logarithm
EXECUTE IMMEDIATE
我们真的可以自我繁殖吗?SQL-ly会更加美丽。.这是纯粹的学习经验。
Oracle公开了这些ODCI(Oracle数据盒带接口)方法来进行汇总!参考:
PRODUCT()的代码聚合函数:
CREATE OR REPLACE type PRODUCT_IMPL AS object ( result NUMBER, static FUNCTION ODCIAggregateInitialize(sctx IN OUT PRODUCT_IMPL) RETURN NUMBER, member FUNCTION ODCIAggregateIterate(self IN OUT PRODUCT_IMPL, value IN NUMBER) RETURN NUMBER, member FUNCTION ODCIAggregateTerminate( self IN PRODUCT_IMPL, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER, member FUNCTION ODCIAggregateMerge(self IN OUT PRODUCT_IMPL, ctx2 IN PRODUCT_IMPL ) RETURN NUMBER ); / /* 1.Initializes the computation by initializing the aggregation context鈥攖he rows over which aggregation is performed: */ CREATE OR REPLACE type body PRODUCT_IMPL IS static FUNCTION ODCIAggregateInitialize(sctx IN OUT PRODUCT_IMPL) RETURN NUMBER IS BEGIN sctx := PRODUCT_IMPL(1); RETURN ODCIConst.Success; END; /* 2.Iteratively processes each successive input value and updates the context: */ member FUNCTION ODCIAggregateIterate(self IN OUT PRODUCT_IMPL, value IN NUMBER) RETURN NUMBER IS BEGIN self.result := value * self.result; RETURN ODCIConst.Success; END; member FUNCTION ODCIAggregateTerminate( self IN PRODUCT_IMPL, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS BEGIN returnValue := self.result; RETURN ODCIConst.Success; END; member FUNCTION ODCIAggregateMerge(self IN OUT PRODUCT_IMPL, ctx2 IN PRODUCT_IMPL) RETURN NUMBER IS BEGIN self.result := self.result; RETURN ODCIConst.Success; END; END; / /* Create A function using the PRODUCT_IMPL implementation we did above */ CREATE OR REPLACE FUNCTION product(input NUMBER) RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING PRODUCT_IMPL; /
结果:
SELECT group_name,product(num) FROM product_test GROUP BY group_name; Mahesh -60000 Mahesh_1 9