前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
先分析一下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中圖形計算視圖的一部分的排名節點的排名函數。
結束。