1. 程式人生 > >CE function 在 SAP HANA 中的介紹及使用

CE function 在 SAP HANA 中的介紹及使用

CE function,即Calculation Engine Plan Operators。因為類似函式的形式,包含輸入引數和輸出引數,並且封裝了對資料的轉化的操作,常被稱作CE函式,或者CE function。CE function 被用於SQLScript 儲存過程中,使用CE function的儲存過程可以直接在calculation engine上進行操作。一般的CE function都有與其相對應的SQL 程式碼的查詢的實現方式,兩者的使用二選其一。     首先,舉一個使用CE function的樣例程式碼,前提是CE function必須使用在SQLScript的儲存過程中。

createprocedure test1(out pro_cat_join pro_cat)  
language sqlscript as
begin
      category_tab1 = CE_COLUMN_TABLE("FURNITURE"."CATEGORY");  
      category_tab2 = CE_PROJECTION(:category_tab1,["CATEGORYID","NAME"
AS
"CATEGORYNAME"]);  
      product_tab = CE_COLUMN_TABLE("FURNITURE"."PRODUCT");  
      pro_cat_join= CE_JOIN(:category_tab2,:product_tab,["CATEGORYID"],["PRODUCTID","CATEGORYID","CATEGORYNAME"]);  
end;  

常用的CE function簡介資料來源的訪問操作系列:將列儲存表格或者列檢視作為資料來源與表變數相繫結。1.CE_COLUMN_TABLE     這個函式使用一個已經存在的列儲存表格作為資料來源,選取其全部或者部分列,返回相應內容繫結到一個表變數上。     例如:選取表PRODUCT 的NAME,COLOR,PRICE三列,繫結到表變數product1上。 

product1 = CE_COLUMN_TABLE("PRODUCT",["NAME","COLOR","PRICE"]);  

     使用SQL語句表示為:

product1 = select"NAME","COLOR","PRICE"from"PRODUCT";  

2.CE_JOIN_VIEW     這個函式使用一個已經存在的連線檢視(即Attribute View,屬性檢視)作為資料來源,選取其全部或者部分列,返回相應內容繫結到一個表變數上。
例如:選取屬性檢視 ATTR_PRODUCT的PRODUCT_NAME,CATEGORY_NAME兩列,繫結到表變數product2上。

product2 = CE_JOIN_VIEW("ATTR_PRODUCT",["PROCUCT_NAME","CATEGORY_NAME"]);  

     使用SQL語句表示為:

product2 = select"PROCUCT_NAME","CATEGORY_NAME"from"ATTR_PRODUCT";  

3.CE_OLAP_VIEW     這個函式使用一個已經存在的OLAP檢視(即Analytical  View,分析檢視)作為資料來源,選取一些關鍵值或者維度作為引數,按這些維度分度並求對應的聚合值,返回相應內容繫結到一個表變數上。
     例如:選取分析師圖ANAL_SALE作為資料來源,按CATEGORY_NAME分組,並求對應每組AMOUNT的和,返回結果繫結到表變數olap_view上。


olap_view = CE_OLAP_VIEW("ANAL_SALE", ["CATEGORY_NAME", SUM("AMOUNT")]);  

     使用SQL語句表示為:

olap_view = select CATEGORY_NAME, SUM(AMOUNT) FROM
"ANAL_SALE"
GROUP
BY CATEGORY_NAME;   

4.CE_CALC_VIEW     這個函式使用一個已經存在的計算檢視(即Calculation View檢視)作為資料來源,選取其全部或部分屬性,返回相應內容繫結到一個表變數上。
     例如:選取計算檢視CALC_SALE的QUANTITY和AMOUNT屬性,繫結到表變數cal上。

cal = CE_CALC_VIEW("CALC_SALE",["QUANTITY","AMOUNT"]);  

     使用SQL語句表示為:

cal = select
"QUANTITY","AMOUNT"
from
"CALC_SALE";  
關係運算系列:可以直接在calculation engine上執行關係運算。5.CE_JOIN     這個函式可以得出給出的兩個表變數通過某些屬性相關聯的內連線的結果集。對於相關聯的兩個屬性,結果中只包含一個,因此要求必須有相同的屬性名,否則提前進行重新命名。同樣,可以選擇在結果中顯示內連線結果的全部或部分屬性。     例如:表變數:product和:category通過屬性”CATEGORYID”進行內連線,並且結果中保留"PRODUCTID","PROJECT_NAME","CATEGORYID","NAME"四個屬性。

product3 = CE_JOIN(:project,:category,["CATEGORYID"],["PRODUCTID","PROJECT_NAME","CATEGORYID","NAME"]);  

     使用SQL語句表示為:

product3= select P."PRODUCTID",P."PROJECT_NAME",P."CATEGORYID",C."NAME"
from :project as P innerjoin :category  as C on P."CATEGORYID"=C."CATEGORYID";   

6.CE_LEFT_OUTER_JOIN     使用方式與CE_JOIN相同,實現左外連線的功能。 7.CE_RIGHT_OUTER_JOIN     使用方式與CE_JOIN相同,實現右外連線的功能。 8.CE_PROJECTION     這個函式選取表變數中的一列或者多列,可以對每列進行重新命名,計算表示式或者使用過濾條件。     例如:選取表變數:product中按條件"PRICE">50篩選並保留的"PRODUCTID","PRICE","NAME"三列,將”NAME”重新命名為”CATEGORYNAME”。

product4 = CE_PROJECTION(:product,["PRODUCTID","PRICE","NAME"
AS
"CATEGORYNAME"],'"PRICE">50');  

     使用SQL語句表示為:

product4 = select
"PRODUCTID","PRICE","NAME"
AS
"CATEGORYNAME"
from :product where
"PRICE">50;  

9.CE_CALC     這個函式用於其它關係操作的函式內部,通常是計算一個表示式的值並且繫結為一個新列,比較常用於CE_PROJECTION函式中。他一般有兩個引數,分別為計算的表示式和結果的資料型別。計算的表示式中還可以使用一些函式,包括轉換函式、字串函式、數學函式、日期函式以及一些其它函式。
例如:選取表變數:product中的cid, cname, oid, sales四列,並將sales與變數:vat_rate所得的乘積作為新的一列,重新命名為” SALES_VAT”。with_tax = CE_PROJECTION(:product, ["CID", "CNAME", "OID", "SALES",CE_CALC('"SALES" * :vat_rate',decimal(10,2)) AS"SALES_VAT"]);  

     使用SQL語句表示為:

with_tax2 = SELECT cid, cname, oid, sales,sales * :vat_rate as sales_vat FROM :product;  

10.CE_AGGREGATION     這個函式對輸入列分組並且計算每個分組的聚合結果,包含常用的COUNT 、 SUM 、 MIN 、 MAX聚合函式。
     例如:對與表變數:product按year進行分組,並計算每組的count()值。

product5 = CE_AGGREGATION (:product,[COUNT ("PRODUCT_ID") AS"CNT"], ["YEAR"]);  

     使用SQL語句表示為:

product5 = SELECT
COUNT ("PRODUCT_ID") AS cnt, year
FROM :product GROUP
BY
year;  

11.CE_UNION_ALL     這個函式計算兩個具有相同列名和列順序表變數UNION ALL的操作,即存在相同行均保留。
     例如:求兩個表變數:product1和:product2的UNION ALL 操作,必須保證倆個變數的列名和順序均相同。

              pro_union_all = CE_UNION_ALL (:product1, :product2);  

     使用SQL語句表示為:

pro_union_all = SELECT * FROM :product1 UNIONALLSELECT * FROM :product2;  
其他CE函式12.CE_VERTICAL_UNION     這個函式的功能是實現垂直UNION,即在保證行數相同的條件下,選取兩個表變數的全部或者部分列拼接成為一個表變數。
     例如:將表變數:firstname的"ID", "FIRSTNAME"兩列和表變數:lastname的"LASTNAME"列拼接成為一個新的表變數。


out = CE_VERTICAL_UNION(:firstname, ["ID", "FIRSTNAME"
AS
"GIVENNAME"], :lastname, ["LASTNAME"
AS
"FAMILYNAME"]);  

特殊使用1.加編號
在使用CE_CALC()時,可以使用rownum()這個函式,返回編號為新的一列,因此可以使用此方式加上編號列。
例如:

product2 = CE_PROJECTION(:product1, ["NAME","COLOR","PRICE",CE_CALC('rownum()',integer) as
"ROWNUM"]);  

     所得到的結果即2.取前n項
     根據上一例子的使用,引申類似的使用。根據rownum()得到編號後,即可以選取前n項。
     例如:取表變數:product1的前五列

product3 = CE_PROJECTION(:product1, ["NAME","COLOR","PRICE",CE_CALC('rownum()',integer) as"ROWNUM"],'"ROWNUM"<5');  

     所得到的結果即使用注意使用CE function由於直接由calculation engine處理,效率相對較高,可能會帶來效能的提升。最好不要把CE function和普通的SQL語句混合使用,因為他們執行在不同的engine上,要避免資料在不同的引擎中反覆傳遞可能會帶來效能上的問題。
使用限制現有的CE function並不能實現所有常用的SQL查詢所能完成的操作。例如連線操作,只有CE_UNION_ALL,可以實現UNION  ALL的操作,而沒有與UNION直接相對應的CE function。同樣,對於連線操作,沒有於外連線(FULL OUTER JOIN)相對應的CE function。但是,可以使用其他CE function結合使用,或使用其他方式來實現相應的功能。 關於CE function的使用,請參考SAP HANA SQLScript Reference