【HANA系列】SAP HANA計算視圖中的RANK使用方法


公眾號: matinal
本文作者: matinal
 

 

前言部分

大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。

正文部分

先分析一下RANK的特點

1、此函數根據分區和排序子句計算數據集的排名。

2、當我們必須從源集中的多個記錄或前N個或后N個記錄中選擇最新記錄時,這將非常有用。

來自官網的介紹。

SQL的寫法如下:

RANK() OVER (PARTITION BY <Colum Name> ORDER BY <Colum Name> ASC/DESC)

SAP HANA從初始版本支持RANK功能 - 如果我們要使用它作為SQL腳本的一部分

但是從SAP HANA SP9版本,我們在創建圖形計算視圖時將此功能作為一個附加節點。

使用舉例及使用場景介紹

這里的情況是,我們有銷售訂單數據,其中,對於現有銷售訂單的每次更改,表中都將有一個新記錄。

當我們在此表上構建報表時,我們必須選擇最近的銷售訂單,即根據訂購時間最近更改的銷售訂單。

1、首先創建表

CREATE COLUMN TABLE SAP_STUDENT.ORDERS_DATA_RANK (ORDER_NO INTEGER,

                                                               CUST_NO NVARCHAR(10),

                                                               PROD_NO NVARCHAR(10),

                                                               QUANTITY INTEGER,

                                                               PRICE INTEGER,

                                                               ORDERED_TIME SECONDDATE)

​

2、然后給表里添加數據

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1234,’C01′,’P012′,10,5,’2015-09-10 08:03:12′);

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1235,’C02′,’P023′,100,10,’2015-09-10 14:45:36′);

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1236,’C03′,’P067′,80,20,’2015-09-15 21:23:56′);

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1234,’C01′,’P012′,30,5,’2015-09-10 11:03:12′);

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1234,’C01′,’P012′,50,5,’2015-09-12 08:03:12′);

INSERT INTO SAP_STUDENT.ORDERS_DATA_RANK VALUES(1236,’C03′,’P067′,120,20,’2015-09-17 11:23:12′);

​

運行上述insert語句后,請運行以下select語句,以確保數據以正確的方式插入,如下所示。

SELECT * FROM SAP_STUDENT.ORDERS_DATA_RANK;

​

rank在sqlscript中使用場景

基於我們的場景,我們必須通過ORDER_NO分區我們的數據集,然后基於ORDERED_TIME列以降序排列,以獲得排在最近更改的銷售訂單的top(first)。

我們可以通過編寫以下SQL語句來實現這一點,SQL語句根據PARTITION和ORDER BY子句計算RANK,並將秩分配為1,2,3等。

一旦我們在RANK函數的幫助下排列數據集,我們可以將RANK值過濾為“1”,以將最近的記錄獲取到輸出。

RANK()使用圖形計算視圖:

現在讓我們看看如何在創建圖形計算視圖時使用rank節點實現同樣的事情。

注意:此節點僅在SAP HANA SP9版本的圖形計算視圖中可用。

請按照以下步驟使用計算視圖構建排名功能。

第一步:

確保我們在SAP HANA系統中創建了上述表並提供了數據。

注意:個人也可以使用自己的數據集來檢查功能。

第二步:

讓我們繼續創建一個類型為'graphical'的新計算視圖,並指定技術名稱和標簽等細節,如下所示。

請參閱“SAP HANA中的圖形計算視圖”獲取計算視圖的完整信息。

第三步:

我們可以在屏幕的左側看到“Rank”節點。 單擊該節點,再次在設計區域上單擊,以將節點添加到我們的設計區域,如下所示。

第四步:

一旦節點添加到設計區域,讓我們將所需的表添加到節點,並查看可用於排名節點的設置。

可用的設置有:

1、SORT DIRECTION

2、THRESHOLD

3、ORDER BY

4、PARTITION

5、Dynamic Partition Elements

6、Generate Rank Column

Sort Direction:

此選項用於根據我們定義的閾值獲取頂部記錄或底部記錄。

我們在這里有兩個選擇,他們是

降序(前N):這從源集合中檢索前N個記錄,其中N是我們定義的閾值。

升序(底部N):這從源數據中檢索底部N個記錄,其中N是我們定義的閾值。

在我們需要最近更改的記錄的情況下,我們將選擇“降序(前N個)”選項。

 

Threshold:

該值由系統用於在計算RANK之后過濾結果數據集。 如果我們將它定義為“1”,系統只給出基於分區和順序的第一個記錄。

該閾值可以是“固定”值或用戶輸入參數。 在我們的例子中,我們將這個定義為“fixed”並賦值5。

 

ORDER BY:

此列用於在系統執行分區子句后執行Order By。

在我們的示例中,我們需要根據ORDERED_TIME列以降序排列銷售訂單,因此我們將在Order By列中添加ORDERED_TIME。

 

Partition:

此列用於根據我們定義的列對源數據集進行分區。

這與我們在SQL腳本中編寫RANK函數相同。 對於我們的場景,分區列將是“ORDER_NO”。

我們可以添加分區列與右側的“添加”按鈕的幫助。

 

Dynamic Partition Elements:

如果要在此模型上運行查詢時,基於我們選擇的列執行分區操作,則需要選中此選項。

 

Generate Rank Column:

如果我們需要在輸出中將rank作為附加列,那么應該選擇此選項。

完成Rank節點所需的所有設置后,屏幕將如下所示。

注意:在我們將列添加到“按訂單排序”和“分區”部分之前,應該選擇列到輸出,如下所示。

第五步:

如果我們看看秩節點的輸出,我們可以看到,秩已經完全計算,但除了1之外,還有其他記錄。

這是因為我們選擇了閾值為“5”,這意味着對於每個分區和順序,我們得到前5個記錄到輸出。

現在我們可以添加另一個projection,並對'排名列'應用過濾器為'1',這樣我們只有前1條記錄。

我們將閾值保持為“5”,只是為了向您展示等級列在輸出中的外觀。

如果我們不需要多於一個記錄到輸出,建議對排序節點本身的數據進行過濾。

所以在我們的場景中,我們可以將閾值保持為'1'。

 

第六步:

讓我們繼續向設計區域添加投影,選擇輸出所需的列,並將'Rank_Column'的過濾器應用於'1',如下所示。

第七步:

讓我們將列添加到輸出並定義屬性和度量,如下所示。

第八步:

成功激活計算視圖后,數據預覽應生成以下數據集,其中每個銷售訂單都有單個記錄(最近修改)。

因此,我們已成功地實現了使用作為SAP HANA中圖形計算視圖的一部分的排名節點的排名函數。

結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM