ORACLE MODEL子句模擬EXCEL函式例項

2021-07-13 06:07:49 字數 3037 閱讀 9687

model字句用來行間計算,可以理解為分析函式的拓展。後面展示乙個不用測試資料的例子:

首先看下**:

select year 年份,

round(gdp, 2) gdp總量,

up * 100 || '%' gdp增速,

country 國家

from (select 2015 year, 16197.96 gdp, 0.03 up, '美國' country

from dual

select 2015 year, 10385.66 gdp, 0.06 up, '中國' country

from dual) --dual 列出2023年中國與美國gdp總量及當年較去年增速

model return updated rows--宣告model字句

partition by (country)--按country欄位分割槽

dimension by (year)--已year為維度

measures(gdp,up)–需要計算的字段,與dimention結合為 gdp=function(year),up=function(year)

rules(

up[for year from 2016 to 2040 increment 1] order by year= up[cv(year)-1]- 0.001,--計算公式:今年gdp總量=去年gdp總量*(1+今年的增速)

gdp[for year from 2016 to 2040 increment 1] order by year= gdp[cv(year)-1]*(1+up[cv(year)]))--計算公式:今年gdp總量=去年gdp總量*(1+今年的增速)

order by year,gdp desc

上述例子說明及sql步驟

1、網上找到2023年中美兩國gdp總量及增速,將其作為子查詢的方式提供兩條資料,另外說明:兩個國家的增速每年都下降0.1%!

2、model return updated rows:宣告model字句,並且返回更新過的資料行ps:此sql的查詢結果將不包含2023年資料!!!

3、partition by (country):按country欄位分割槽,類似於分析函式中的分割槽

4、dimension by (year)-:已year為維度

5、measures(gdp,up):需要計算的字段,與dimention結合為 gdp=function(year),up=function(year),即當year為***值時,gdp與up為***值

6、rules:寫出第5點中的function,例如:up[for year from 2016 to 2040 increment 1] order by year= up[cv(year)-1]- 0.001

--計算公式:今年gdp總量=去年gdp總量*(1+今年的增速)

--通過for宣告強制構造出year由2023年到2023年資料,year間隔為1

--order by宣告排序,預設情況下model行間運算為序列排序,不會按year進行排序後進行行間運算,或者可使用rules automatic order讓優化器自動排序 (需考慮場景)

--rules中隊up及gdp欄位的處理先後順序需要將up放在前面,原因是:計算公式:今年gdp總量=去年gdp總量*(1+今年的增速),得到今年增速才能計算總量

--cv(year)表示當前行的year,cv=current value

輸出結果:

gdp總量單位-萬億

從結果中可以看到中國將在2023年在gdp總量上超越美國!!!

每個年份都有兩個國家的資料,這是配合partition子句才說明的!!!當把兩個國家的資料合成一行,那麼partition子句將不再需要,如以下sql:

select year 年份,

round(us_gdp, 2) 美國gdp總量,

us_up * 100 || '%' 美國gdp增速,

round(chn_gdp, 2) 中國gdp總量,

chn_up * 100 || '%' 中國gdp增速

from (select 2015 year,

16197.96 us_gdp,

0.03 us_up,

10385.66 chn_gdp,

0.06 chn_up

from dual)--dual 列出2023年中國與美國gdp總量及當年較去年增速

model return updated rows

dimension by (year)

measures(us_gdp,us_up,chn_gdp,chn_up)

rules(

us_up[for year from 2016 to 2040 increment 1] order by year= us_up[cv(year)-1]- 0.001,--今年增速較去年下降0.1%

chn_up[for year from 2016 to 2040 increment 1] order by year= chn_up[cv(year)-1]-0.001,--今年增速較去年下降0.1%

us_gdp[for year from 2016 to 2040 increment 1] order by year= us_gdp[cv(year)-1]*(1+us_up[cv(year)]),--計算公式:今年gdp總量=去年gdp總量*(1+今年的增速)

chn_gdp[for year from 2016 to 2040 increment 1] order by year= chn_gdp[cv(year)-1]*(1+chn_up[cv(year)]))--計算公式:今年gdp總量=去年gdp總量*(1+今年的增速)

輸出結果:

感興趣的同學可以看下面兩個鏈結,對model子句都有詳細的說明

mysql in子句 MySQL IN 子句

可以使用 in 子句代替許多 or 條件。要想理解 in 子句,還以表 employee tbl 為例,它的所有記錄如下所示 mysql select from employee tbl id name work date daily typing pages 1 john 2007 01 24 2...

LINQ let子句 join子句

1.let子句 let子句用於在linq表示式中儲存子表示式的計算結果,既let子句建立乙個範圍變數來儲存結果,變數被建立後,不能修改或把其他表示式的結果重新賦值給它。此範圍變數可以在後續的linq中使用 static void main string args new custom var que...

Mysql ON 子句和 USING 子句

mysql 中聯接 sql 語句中,on 子句的語法格式為 table1.column name table2.column name。當模式設計對聯接表的列採用了相同的命名樣式時,就可以使用 using 語法來簡化 on 語法,格式為 using column name 例如 select f.c...