2016-11-10 109 views
3

我試圖計算一個DAX中的業務邏輯,事實證明這是相當資源沉重和複雜的。我有一個非常大的PowerPivot模型(稱之爲「銷售」),有許多維度和措施。銷售模式的簡化圖:在Dax中有效計算DISTINCTCOUNT的平均值?

+-------+--------+---------+------+---------+-------+ 
| State | City | Store | Week | Product | Sales | 
+-------+--------+---------+------+---------+-------+ 
| NY | NYC | Charlie | 1 | A  | $5 | 
| MA | Boston | Bravo | 2 | B  | $10 | 
| -  | D.C. | Delta | 1 | A  | $20 | 
+-------+--------+---------+------+---------+-------+ 

基本上我想要做的是存儲和計算一週產品的DISTINCTCOUNT:

SUMMARIZE(Sales,[Store],[Week],"Distinct Products",DISTINCTCOUNT([Product])) 

+---------+------+-------------------+ 
| Store | Week | Distinct Products | 
+---------+------+-------------------+ 
| Charlie | 1 |    15 | 
| Charlie | 2 |     7 | 
| Charlie | 3 |    12 | 
| Bravo | 1 |    20 | 
| Bravo | 2 |    14 | 
| Bravo | 3 |    22 | 
+---------+------+-------------------+ 

那麼我想計算其平均值在商店層面的不同產品。我走近這個問題的方法是通過採取前面的計算,並運行在它上面的一個SUMX,並通過不同的幾周將其劃分:

SUMX(
SUMMARIZE(Sales,[Store],[Week],"Distinct Products",DISTINCTCOUNT([Product])) 
,[Distinct Products] 
)/DISTINCTCOUNT([Week]) 

+---------+------------------+ 
| Store | Average Products | 
+---------+------------------+ 
| Charlie | 11.3    | 
| Bravo | 18.7    | 
+---------+------------------+ 

我存儲在衡量這個計算和它的工作以及當這些數據較小。但是現在數據集非常龐大,當我嘗試使用這個度量時,它會一直掛起,直到我必須取消這個過程。

有沒有更有效的方法來做到這一點?

回答

2

SUMX在這種情況下是合適的,因爲您希望爲每個商店每個商店&獨立計算不同的產品計數,然後由商店將其相加,然後除以商店的週數。這是沒有辦法的。 (如果有的話,我會推薦它。)

但是,SUMX是一個迭代器,減速的可能原因也是如此。由於我們無法完全消除SUMX,因此這裏最大的因素是您擁有的商店/週數組合。

要確認商店/周的組合數是否是減速的來源,請嘗試過濾或刪除數據模型副本中的50%,然後查看是否會加快速度。如果沒有超時,請重新添加更多以瞭解失敗點的組合數。

要使用完整數據集使事情更快:

  1. 您可以過濾到店/周在數據透視表的一部分,拖在測量之前。這通常會比首先拖動度量值,然後添加過濾器得到更快的結果。 (這不是對您的測量的真正改變,而是對您的模型用戶更多的行爲改變)。
  2. 您可能需要考慮比周(例如月)更高的級別進行分組,以減少它需要迭代的組合數
  3. 如果您運行的是Excel 32位,或者只有4GB的RAM ,考慮64位Excel和/或更強大的機器(我懷疑是這種情況,但包括全面性 - Power Pivot可以成爲一個資源豬)
  4. 如果您可以將您的模型移動到Power BI Desktop(I不相信Power Pivot中支持計算表),您可以將SUMMARIZE解壓縮到計算表中,然後重新編寫度量以引用計算的表。這減少了測量在運行時執行的計算次數,因爲商店/周加上產品的不同計數的所有組合將被預先計算(僅留下用於測量的總計&分區 - 很多更少的工作)。

Calculated Table = 
SUMMARIZE (
    Sales, 
    [Store], 
    [Week], 
    "Distinct Products", DISTINCTCOUNT (Sales[Product]) 
) 

注:上面的計算表的代碼是不成熟,並且大多設計爲概念的證明。如果這是你採取的路徑,你要確保你有一個獨立的商店維度加入計算表,因爲這將不會加入到源表直接

Measure Using Calc Table = 
SUMX (
    'Calculated Table', 
    [Distinct Products]/DISTINCTCOUNT ('Calculated Table'[Week]) 
) 

賈森·托馬斯在計算表格上的一個很棒的帖子,以及他們什麼時候可以在這裏有用:http://sqljason.com/2015/09/my-thoughts-on-calculated-tables-in.html

如果您不能使用計算表,但是您的數據來自某種形式的數據庫,那麼您可以在SQL中執行相同的邏輯,然後導入預先準備的獨立商店/月份單獨表及其不同的計數。

我希望這些證明有用(或者你已經用另一種方式解決了這個問題)。

+0

注意:當商店/周的組合數量增加到750k時,我纔開始注意到放緩(使用Power BI Desktop) - 這是很多組合(儘管當然性能會因數據而異,數據模型的大小和設計,機器的規格等) – Leonard

+1

謝謝!這個問題是從6個月前開始的,後來我開始轉向一個全新的角色,所以我不能用你的想法測試相同的數據集,但是我真的很欣賞這個輸入。很高興知道我的方法大多是正確的方法,只是希望Powerpivot可以在服務器上運行或者其他東西:) PowerBI絕對是一種選擇,但不幸的是,這必須在Excel電子表格中完成。傷心的是,PowerPivot不支持像PowerBI一樣創建DAX表!這是一個基本特徵。再次感謝。 – RedVII