我們都知道,對數相加具有以下性質:
ln(2)+ln(5)= ln(2*5) = ln(10)
因此只需要對需要相乘的引數,取對數求和後,再使用指數函式,就可以求得相乘的結果。而sql的sum()聚合函式支援求和,exp()支援求指數,那就實現了跨行相乘。
--構建例項實現跨行相乘例項2*5
create
table t1 (num number)
;insert
into t1 values(2);
insert
into t1 values(5);
select num from t1;
select exp(
sum(ln(num)))
from t1;
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-qtl3bzpb-1606552335176)(
使用關聯子查詢,構建兩層查詢。
外層查詢從根節點開始,自上而下,構建出整個樹的形狀。
內層查詢自下而上,構建出當前節點到根節點的結果集。對結果集進行跨行相乘,得到該節點乘積。
select
level
, o.id
, o.yield,(
select
round
( exp(
sum(ln(i.yield)))
,2)-- 對相乘結果保留四捨五入保留兩位
from
hierarchy_example i
start
with
i.id = o.id -- 使用關聯子查詢,將外層查詢的id代入內層查詢
connect
by nocycle
i.id = prior i.prior_id -- 使用外層查詢的id,自下而上遍歷整棵樹
)as yield_to_step
, connect_by_root( o.id )
as root_id
, sys_connect_by_path( o.id,
'/')
as path
from
hierarchy_example o
start
with
o.prior_id is
null
-- 外層查詢,從根結點開始
connect
by nocycle
o.prior_id = prior o.id -- 外層查詢自上而下。
order siblings by
o.id;
Oracle表中實現遞迴查詢樹形結構
若將乙個樹狀結構儲存在一張表裡,需要在表中存入兩個欄位id和parentid,表示每一條記錄的parent是誰。table treetable idparentid 欄位3 1nulla 21b 32d oracle中可以使用 select from start with 開始的節點 connect...
oracle如何實現lastindexof的功能
第一種實現方法 reverse substr reverse str 1,instr reverse str 1 利用reverse函式,該函式的功能是反轉倒置。但是據測試在儲存過程中不能使用。於是到網上找了另外一種實現方法。第二種 substr str,instr str,1,1 1,length...
Oracle 中實現查詢樹形結構節點功能
這個方法只是對oracle10以上才有效,對sqlserver mysql沒有測試 select connect by isleaf isleaf,tb.switch type id,sys connect by path tb.package id,path,tb.record type,tb.e...