QlikView Script 組合鍵處理

2021-05-23 07:32:34 字數 2369 閱讀 8952

qlikview裝載資料時,如果有兩個或以上表中存在兩個或以上相同的字段時就會自動產生組合鍵。

組合鍵實際上是產生了表間的多對多關係,這種關係邏輯上可能是對的。組合鍵會引起qlikview效能隱患,儲存所有出現的組合值,在資料量很大時會消耗太多的記憶體。組合鍵越多qlikview的執行效能下降越厲害,百萬級資料量情況下如果4-5個組合鍵,系統可能執行都成問題。

如何處理出現的組合鍵呢?

case1:源資料表中組合的字段並不具有邏輯的組合含義,採用重新命名方式解決

例如:訂單:

load

訂單號,訂單日期,訂單金額,操作員,操作時間

from db.sales;

訂單明細:

load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

from db.salesdetails;

如果qlikview直接裝載會產生「訂單號、操作員,操作時間」這三個欄位的組合鍵。再細看一下,訂單和訂單明細表中都有操作員、操作時間兩個字段,而這兩個欄位對沒有邏輯上的關聯,因此可以rename該欄位名稱。

修改如下:

訂單:load

as訂單_操作時間

from db.sales;

訂單明細:

load

as 訂單明細_操作員,操作時間as 訂單明細_操作時間from db.salesdetails;

如果重複的字段較多,則可以採用qualify關鍵字。寫法如下:

qualify  操作員,操作時間;

訂單:load

訂單號,訂單日期,訂單金額,操作員,操作時間

from db.sales;

訂單明細:

load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

from db.salesdetails;

或者qualify *;

訂單:load

訂單號,訂單日期,訂單金額,操作員,操作時間

from db.sales;

訂單明細:

load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

from db.salesdetails;

unqualify *;

qualify關鍵字支援?,*等萬用字元。

case2:源資料中邏輯上存在多對多的組合鍵,可以採用建立key進行處理

例如:訂單明細:

load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

from db.salesdetails;

採購單:

訂單號,產品號,銷售商號,採購時間,採購數量,採購單價

from db.supply;

「訂單號,產品號」在訂單明細和採購單兩表中邏輯上存在多對多關係,這時可以採用建立乙個新的鍵值來表示:

訂單明細:

load

訂單號,產品號,

訂單號&』-』&產品號 as supplykey,

產品數量,產品單價,操作員,操作時間

from db.salesdetails;

採購單:

訂單號&』-』&產品號 as supplykey,

,銷售商號,採購時間,採購數量,採購單價

from db.supply;

有時組合鍵很長,這樣也會多耗費qv的記憶體,可以進一步優化:

autonumber(訂單號&』-』&產品號) as supplykey產生組合鍵值

autonumber會根據「訂單號&』-』&產品號」不同產生唯一的數值。該函式的缺點就是不能用於增量資料裝載的環境中,因為autonumber每次裝載會重新編號。

要解決這個問題,qv8提供了hash128()函式,寫法如下:

hash128(訂單號&』-』&產品號) as supplykey

case2:源資料中邏輯上存在多對多的組合鍵,組合欄位較多,可以採用合併大表的方式解決

例如:***:

load

a,b,c,d,e,f

from db.***;

yyy:

load

a,b,c,d,h,i

from db.yyyy;

***和yyy表中都有a,b,c,d欄位,可以考慮組合成大表的方式解決,採用concatenate關鍵字:

***:

load

a,b,c,d,e,f

from db.***;

concatenate

load

a,b,c,d,h,i

from db.yyyy;

2018 07 08 2018提高組 模擬C組

fj準備教他的奶牛彈奏一首歌曲,歌曲由n 1 n 50,000 種音節組成,編號為1到n,而且一定按照從1到n的順序進行彈奏,第i種音節持續b i 1 b i 10,000 個節拍,節拍從0開始計數,因此從節拍0到節拍b 1 1彈奏的是第1種音節,從b 1到b 1 b 2 1彈奏的是第2種音節,依此...

Socket怎麼加入組播組

byte b new byte 10240 trycatch exception ex console.writeline receive multicast exception ex.tostring 這是我上國外 找的例子!是 用udpclient.joinmulticastgroup,但是ud...

Game組首次超過Hack組

game組成員超過hack組,不過game的大部分人都不認識,有的甚至沒有聯絡過。我的好友中還有部分hack沒有聯絡上,至少應該還有20名左右吧,實際上加起來應該還比game組的多。我的好友中大部分應該是搞過c 或winsdk程式設計的,至少是學過程式設計。懷念從2000年至今的程式設計學習生涯,這...