行列式
行列式與資料來源中索引鍵和索引的概念最為密切相關,它們是根據資料來源中的唯一索引鍵和索引資訊匯入的。 建議您經常檢閱匯入的行列式,並在必要時修改這些行列式或建立其他行列式。 透過修改行列式,您可以置換資料來源中的索引和索引鍵資訊,將其取代為更符合產生報告和分析所需要的資訊。 透過新增行列式,您可以表示與應用程式相關的重複資料群組。
以下「時間」範例中「日」是唯一行列式的範例。 「月份」是非唯一行列式的範例;「月份」中的索引鍵根據特定月份的日次而重複。
當您定義非唯一行列式時,應該指定分組依據。 這向 IBM® Cognos ® Software 指出,當與該行列式相關聯的索引鍵或屬性在資料中重複時,它應該套用聚集函數並分組,以避免重複計算。 不建議您指定同時選取唯一識別和分組依據或兩者都不選取的行列式。
年份索引鍵 | 月份索引鍵 | 月份名稱 | 日索引鍵 | 日名稱 |
---|---|---|---|---|
2006 | 200601 | 2006 年 1 月 | 20060101 | 2006 年 1 月 1 日,星期日 |
2006 | 200601 | 2006 年 1 月 | 20060102 | 2006 年 1 月 2 日,星期一 |
您可以如下所示為此資料集定義三個行列式 - 兩個分組依據行列式(「年份」和「月份」),以及一個唯一行列式(「日」)。 此概念與層次和階層的概念類似,但不相同。
行列式名稱 | 索引鍵 | 屬性 | 唯一識別 | 分組依據 |
---|---|---|---|---|
年份 | 年份索引鍵 | 無 | 否 | 是 |
月 | 月份索引鍵 | 月份名稱 | 否 | 是 |
日 | 日索引鍵 | 日名稱 月份索引鍵 月份名稱 年份索引鍵 |
是 | 否 |
在此情況下,我們針對每一個行列式只使用一個索引鍵,因為每一個索引鍵都包含可識別資料內群組的足夠資訊。 如果「月份」索引鍵未包含足夠的資訊可闡明月份所屬的年份,則「月份」通常會成為一個問題。 如果「月份」索引鍵無法唯一識別月份屬於哪個特定年份,請在「月份」行列式的索引鍵定義中併入「年份」索引鍵。
附註:雖然您可以在沒有「年份」環境定義的情況下建立可對月份進行分組的行列式,但這不是常用的產生報告選擇,因為這會將所有年份 2 月的所有資料分在同一組,而不只是 2006 年 2 月的所有資料。
使用具有多部分索引鍵的行列式
在上述「時間」維度範例中,一個索引鍵就足以識別行列式的每一組資料,但並不是所有情況都如此。
例如,下列「地理位置」維度針對一個行列式除外的所有其他行列式都使用多部分索引鍵定義。
地區 | 地區索引鍵 | 州/省索引鍵 | 城市索引鍵 |
---|---|---|---|
北美洲 | 美國 | 伊利諾州 | 春田(美國伊利諾州首府) |
北美洲 | 美國 | 密蘇里州 | 春田(美國伊利諾州首府) |
北美洲 | 美國 | 加州 | 都柏林 |
歐洲 | 愛爾蘭 | n/a | 都柏林 |
與有關「時間」的範例類似,您可以如下所示為此資料集定義三個行列式 - 兩個分組依據行列式(「地區」和「州/省」),以及一個唯一行列式(「城市」)。
行列式名稱 | 索引鍵 | 屬性 | 唯一識別 | 分組依據 |
---|---|---|---|---|
地區 | 地區索引鍵 | 無 | 否 | 是 |
州/省 | 州/省索引鍵 | 無 | 否 | 是 |
城市 | 地區索引鍵 州/省索引鍵 城市索引鍵 |
無 | 是 | 否 |
在此情況下,我們使用「地區索引鍵」、「州/省索引鍵」和「城市索引鍵」來確保「城市」的唯一性。 這樣做是因為在我們提供的資料中,部分城市名稱在各州或各省間重複出現,而這些州或省又在地區中重複出現。
行列式是依其指定的順序進行評估
行列式中沒有階層概念,但有計算順序。 當 IBM Cognos Software 查看從查詢主題中選取的項目時,它會依照 行列式 標籤中設定的順序,逐一將它們與每一個行列式 (索引鍵和屬性) 進行比較。 以此方式, IBM Cognos Software 會選取最符合的行列式。
在下列範例中,當月、當月日次和本地化月份名稱等屬性與「月份」索引鍵相關聯。 提交的查詢參照上述任一屬性時,「月份」行列式就是第一個可滿足符合準則的行列式。 如果不需要任何其他屬性,則行列式的計算會止於「月份」,並且此行列式將用於 SQL 中的 group
和 for
子句。
如果也包含維度的其他屬性,如果那些屬性未符合前一個行列式,則 IBM Cognos Software 會繼續評估,直到找到相符項或到達最後一個行列式為止。 因此,唯一行列式具有與之關聯的所有查詢項目。 如果找不到其他符合項,則會使用整個資料集的唯一索引鍵來判斷對資料進行分組的方式。
使用行列式的時機
當行列式可用來解決與資料精度相關的各種問題時,在下列主要情況下您應該一律使用行列式:
- 作為維度進行作業的查詢主題具有多個精度層次,並且將以不同的索引鍵集結合至事實資料。
例如,「時間」具有多個層次,它以「月份」索引鍵結合至「庫存」,以「日」索引鍵結合至「銷售」。
如需相關資訊,請參閱 何謂多事實、多精度查詢?。
- 需要對重複的索引鍵或屬性進行計數或執行其他聚集函數。
例如,「時間」具有「月份」索引鍵和「當月日次」這一屬性,每日都有這個屬性。 如果您要在報告中使用「當月日次」,則不會希望計算該月份每日「當月日次」的總和。 而是希望取得所選擇「月份」索引鍵的「當月日次」的唯一值。 在 SQL 中,即為
XMIN(Days in the month for Month_Key)
。 Cognos SQL 中也有一個Group by
子句。 - 在度量來自維度表格(度量位於 1-N 結合的 1 端),或當度量來自非正規化數據表時,若要避免重複計算。
聚集重複值稱為「雙計數」值。 為了避免重複計數,查詢規劃程式碼可以根據定義度量所在的查詢主題中指定的行列式,產生特定的 SQL 型樣。
行列式的索引鍵區段會定義可唯一識別一列資料的直欄。 選取行列式上的分組方式內容會指示查詢規劃處理程序產生不會計算重複測量值的 SQL,因此只能聚集非重複的值。
下列是一些需要使用行列式的不常見情況:
- 從資料來源擷取文字 BLOB 資料時,您要唯一識別資料列。
查詢 BLOB 需要其他索引鍵或索引類型資訊。 如果資料來源中沒有此資訊,您可以使用行列式新增。 置換從資料來源匯入且與為產生報告建立的關係相互衝突的行列式。
在查詢主題存取 BLOB 資料時,您無法使用多區段索引鍵。 使用摘要查詢,必須從查詢的摘要部分個別擷取 BLOB 資料。 若要執行此作業,您需要一個可唯一識別列的索引鍵,並且該索引鍵不能具有多個區段。
- 指定的結合所使用的索引鍵比為查詢主題指定的唯一行列式所使用的索引鍵少。
如果您的結合建置在由關係的
0..1
或1..1
端的唯一行列式的索引鍵所參照的直欄子集基礎之上,則會出現衝突。 可透過修改關係以與行列式完全一致,或修改行列式以支援關係來解決衝突。 - 您想要置換從資料來源匯入且與為產生報告建立的關係相互衝突的行列式。
例如,行列式存在於適用多個直欄的兩個查詢主題上,但這兩個查詢主題之間的關係僅使用這些直欄的子集。 如果不適合在關係中使用其他直欄,請修改查詢主題的行列式資訊。
指定行列式的位置
行列式應該指定於已定義報告時所使用關係之層的查詢主題。
例如,如果所有關係結合是建立在資料庫(匯入)層,則請在該層驗證或指定行列式。
如果您建立業務層(建議這麼做以便使報告與基礎的資料來源隔離),並在該處定義關係結合,則行列式應該指定在該層。 讓關係和行列式位於商業層可以簡化查詢規劃,因為 IBM Cognos Analytics 不需要在模型中進一步向下遍訪即可適當地規劃查詢。