在SQL Server Analysis Service中,維度(Dimension)是一個非常重要的概念,通常情況下一個包含多個屬性,每個屬性為某個對象(例如Customer, Product等)的一個欄位表現。這樣,對於每個維度特定屬性,唯一列舉了所有可能出現的值。在某些情況下,這些屬性具有數百萬個值而且不具有任何階層,這對於業務人員來說要想找到某個特定的值就會非常困難,如果能夠將他們分組-例如Year-Quater-Month-Date這樣的結構類似,但不採用Hierarchy--這樣尋找起來就會非常簡單。這就引入了分組的概念。舉個簡單的例子對於年度營收,在一個擁有數百萬員工的單位,每個人的工資收入在很大範圍內是不同的,這樣Yearly Income這個屬性就會有很多的值。而在現實中我們可能更喜歡根據一個區間去限制這些統計值。分組的概念就是將這些屬性值按區間進行歸類。
成員組是系統產生的連續維度成員的集合。 在 Microsoft SQL Server Analysis Services 中,可以通過名為離散化的進程將屬性成員分成若干成員組。階層中的層級或者包含成員組,或者包含成員,但是不能同時包含二者。 業務使用者瀏覽包含成員組的層級時,將看見成員組的名稱和單元值。 由 Analysis Services 為了支援成員組而產生的成員稱為分組成員,看上去與普通成員相同。
通過使用DiscretizationMethod和DiscretizationBucketCount屬性,Analysis Service可以自動為您建立組.使用DiscretizationMethod 屬性控製成員的分組方式:
DiscretizationMethod 設定 |
|
None |
顯示成員,不分組。 |
Automatic |
選擇最佳資料標記法: EqualAreas 方法或 Clusters 方法。 |
EqualAreas |
嘗試將屬性中的成員分成若干包含相同數量成員的組。 |
Clusters |
嘗試通過抽樣定型資料、初始化為大量隨機點和運行幾次期望最大化 (EM) 群集演算法的迭代來將屬性中的成員分成若干組。 本方法的好處是適用於任何分布曲線,但就處理時間而言開銷較大。 |
例如,對於Adventure Works DW2008,我將Yearly Income的DiscretizationMethod屬性設定為Automatic後會有如下分組:
但很顯然,這讓你無法可以隨心所欲的控制區間及顯示名稱(即使你可以使用Name Template)。某些情況下如果你願意,你也可以通過在資料庫表中增加一個計算資料行來控制,這會讓你更容易去決定他們的區間和名稱。
CASE WHEN Weight IS NULL OR Weight<0 THEN 'N/A'
WHEN Weight<10 THEN '0-10Kg'
WHEN Weight<20 THEN '10-20Kg'
ELSE '20Kg or More'
END
命名模板
當建立成員組時,會自動產生成員組的名稱。 除非您指定了一個命名模板,否則使用預設的命名模板。 通過在某個特性的 NameColumn 屬性的 Format 選項中指定命名模板,可以更改此命名方法。 可以針對資料行繫結(用於特性的 NameColumn 屬性)的 Translations 集合中指定的每種語言重新定義不同的命名模板。預設的命名模板為 "%{First bucket member} - %{Last bucket member}"
。
變數 |
說明 |
%{First bucket member} |
包含在當前成員組中的第一個成員的名稱。 |
%{Last bucket member} |
包含在當前成員組中的最後一個成員的名稱。 |
%{Previous bucket last member} |
分配到上一個成員組的最後一個成員的名稱。 |
%{Next bucket first member} |
分配到下一個成員組的第一個成員的名稱。 |
%{Bucket Min} |
要分配到當前成員組的最小成員數。 |
%{Bucket Max} |
要分配到當前成員組的最大成員數。 |
%{Previous Bucket Max} |
要分配到上一個成員組的最大成員數。 |
%{Next Bucket Min} |
要分配到下一個成員組的最小成員數。 |
例如我們將YearlyIncome的NameColumn屬性的Format選項設定為”Less than %{Next Bucket Min};Between %{First bucket member} and %{Last bucket member};Greater than %{Previous Bucket Max}”,分組的名稱會有所改變。我們可以通過Name Template來改變各個分組的名稱:
使用離散化屬性更新維度
處理維度時,離散化屬性只在完全更新 (ProcessFull) 中進行重新離散化。 若要對屬性進行重新離散化,必須對維度執行完全更新。 如果離散化屬性的維度資料表已更新,並且您使用增量式更新 (ProcessAdd) 處理該維度,則離散化屬性不會進行重新離散化。 新儲存的名稱和子級將保持不變。