PowerBI 第二篇:數據建模

来源:http://www.cnblogs.com/ljhdo/archive/2017/04/27/4552739.html
-Advertisement-
Play Games

在分析數據時,不可能總是對單個數據表進行分析,有時需要把多個數據表導入到PowerBI中,通過多個表中的數據及其關係來執行一些複雜的數據分析任務,因此,為準確計算分析的結果,需要在數據建模中,創建數據表之間的關係。在PowerBI中,關係(Relationship)是指數據表之間的基數(Cardin ...


在分析數據時,不可能總是對單個數據表進行分析,有時需要把多個數據表導入到PowerBI中,通過多個表中的數據及其關係來執行一些複雜的數據分析任務,因此,為準確計算分析的結果,需要在數據建模中,創建數據表之間的關係。在PowerBI中,關係(Relationship)是指數據表之間的基數(Cardinality)和交叉篩選方向(Cross Filter Direction)。

基數(Cardinality)

基數關係類似於關係表的外鍵引用,都是通過兩個數據表之間的單個數據列進行關聯,該數據列叫做查找列,兩個數據表之間的基數關係是1:1,或者1:N,或者N:1,基數關係表示的含義是:

  • 多對一 (N:1):這是最常見的預設類型。這意味著一個表中的列可具有一個值的多個實例,而另一個相關表(常稱為查找表)僅具有一個值的一個實例。
  • 一對一 (1:1):這意味著一個表中的列僅具有特定值的一個實例,而另一個相關表也是如此。

例如,TableA和TableB之間的基數關係是1:N,那麼TableA是TableB的查找表,TableB叫做引用表,在查找表中,查找列的值是唯一的,不允許存在重覆值,而在引用表中,查找列的值不唯一。

在PowerBI中,有時,引用表會引用查找表中不存在的數據,預設情況下,PowerBI會自動在查找表中增加一個查找值Blank,所有不存在於查找表中的值,都映射到Blank。

交叉篩選方向(Cross Filter Direction)

篩選方向是篩選的流向,表示一個篩選條件對其他相關表進行過濾,例如,TableA對TableB過濾,其篩選方向可以是雙向,或單向:

  • 雙向:預設方向,這意味著為進行篩選,兩個表均被視為是同一個表,這非常適用於其周圍具有多個查找表的單個表。
  • 單向:這意味著一個表只能對另外一個表進行篩選,而不能反向過濾。

一,雙向篩選關係

在星型結構中,中間是一個引用表,周圍是多個查找表,引用表和查找表之間的篩選關係是雙向的,如下所示:

通常情況下,雙向篩選用於星型結構,是預設的方向,但是,雙向篩選不太適合以下關係圖中的模式,在該模式中,篩選方向形成一個迴圈,對於此類關係模式,雙向篩選會創建一組語義不明的關係,例如,求取 TableX 中某個欄位的總和,如果選擇按照 TableY 中的某個欄位進行篩選,則不清楚篩選器應該如何流動,是通過頂部表,還是底部表進行流動? 

如果雙向篩選導致數據關係的多義性,那麼,可以導入表格兩次(第二次使用其他名稱)以消除迴圈。 這會產生類似於星型架構的關係模式,藉助星型架構,所有關係均可設置為“雙向”。

二,創建間接關係

在PowerBI報表的關係中,直接關係是指關係的兩個表直接接觸,間接關係是指通過中間表建立關係的兩個數據表,間接關係關聯的兩個數據表不直接接觸,如下圖,數據表Students和StudentCourse之間的關係是直接關係,數據表Course和StudentCourse之間的關係是直接關係,而數據表Students和Courses之間通過StudentCourse建立間接關係。間接關係通過一系列有直接關係的數據表,能夠實現數據的交互,這是PowerBI自動實現的,為創建複雜的數據模型提供了支持,但是,在數據建模中使用間接關係時,務必謹慎,PowerBI對Filter選項的全選和不選的處理是有區別的。

1,使用以下腳本創建具有多層關係的數據表

腳本創建了四個表,分別是用於表示學生,課程,學生選課,學生演講,學生和課程之間的關係是1:N,學生和演講活動之間的關係是1:N

create table dbo.Courses
(
CourseID int not null primary key clustered,
CourseName varchar(32) not null
)

create table dbo.Students
(
StudentID int not null primary key clustered,
StudentName varchar(64) not null
)

create table dbo.StudentCourse
(
    StudentID int not null,
    CourseID int not null,
    constraint PK__StudentCourse primary key clustered(StudentID,CourseID)
)

create table dbo.StudentSpeaker
(
    StudentID int not null,
    EventID int not null
)

insert into dbo.Courses(CourseID,CourseName)
values(1,'English'),(2,'Chinese')

insert into dbo.Students(StudentID,StudentName)
values(1,'stu_a'),(2,'stu_b'),(3,'stu_c'),(4,'stu_d')

insert into dbo.StudentCourse(StudentID,CourseID)
values(1,1),(2,1),(3,2)

insert into dbo.StudentSpeaker(StudentID,EventID)
values(1,101),(4,102)
View Code

2,在Relationships視圖中,創建表之間的關係

基數關係(Cardinality)根據數據之間的關係創建,篩選方向根據過濾的邏輯設置。預設情況下,PowerBI會自動檢查(AutoDetect)數據之間的關係,根據檢查的結果(列名和列值的唯一性)自動創建關係,在Relationships視圖中,關係是一條有方向的折線,折線的兩端是數字,表示基數(Cardinality)關係,折線中間的有向箭頭表示篩選方向(Direction)。

PowerBI不會智能到盡善盡美,用戶需要根據數據內在的關係對PowerBI自動創建的關係進行修正,或者,例如,把數據表Students和StudentCourse之間的關係修改為:1:N和雙向篩選,雙擊關係(折線),彈出編輯關係(Edit Relationship)的窗體:

在每個表下方面板中,會顯示列名和示例數據。基數(Cardinality)關係是Many to one,其表達式是:*:1,表達式左邊的表位於上面,右邊的表位於下麵,用於建立關係的數據列是灰色選中狀態。交叉篩選方向(Cross filter direction)選擇Both,勾選“Make this relationship active”,點擊OK,完成關係的創建,如下圖,點擊關係(折線),用於建立關係的數據列處於選中狀態。

三,利用間接關係實現業務需求

報表需要實現的業務需求是:根據課程(Course)統計作為演講者(Speaker)的學生數量

在做報表時,必須熟悉數據和數據之間的關係,在數據表StudentCourse中,共有3個學生選課,學號分別是1、2和3,存在不選課的學生,而在數據表StudentSpeaker中,只有學號1的學生滿足條件,因此,根據課程(Course)統計作為演講者(Speaker)的學生數量的結果應該是:

  • 選修English的學生數量是0;
  • 修改Chinese的學生數量是1;
  • 對所有課程做統計,學生數量是選修English和選修Chinese的數量之和,1(=0+1);

1,設置課程Filter

數據表Course是查找表,由於StudentCourse中的課程(CourseID)都存在於Course表中,所有,Slicer圖表中不存在Blank選項。

2,添加Card圖表,顯示統計數量

在Page中添加Card圖表(Visualizations),在圖表的Fields屬性中,選擇數據表SutdentSpeaker的StudentID欄位,屬性值自動變成:聚合函數+ of +欄位值。

 

3,設置聚合函數

由於一個學生,可能在多個活動(Event)中擔當演講者(Speaker),因此,必須對StudentID進行去重,在圖表的Fields屬性值“Count of StudentID” 中右擊,選擇聚合函數選擇Count(Distinct)

4,設置圖表的顯示屬性

切換到“刷子”Icon,禁用Category lable,啟用Title,修改Title Text、Font color,Alignment和Text Size,

5,分析報表數據

課程選擇Chinese,數量是Blank

課程選擇English,數量是1

選擇所有課程,數量是1

6,清洗數據

預設情況下,圖表不選擇任何課程(Course),數量是2,這個結果在邏輯上是“錯誤”的,對於沒有選擇任何選項的Filter,PowerBI不會做任何篩選關聯。

導致錯誤的原因是由於數據表StudentSpeaker出現臟數據,沒有選修任何課程的學生(本例是學號為4的學生)出現在StudentSpeaker數據表中,要修正查詢的結果,必須清洗臟數據。

四,編輯交互行為

選擇不同的CourseName,度量值Speaker#自動根據Filter做相應的數據過濾,重新統計數據,這種過濾的流向是單向的,由數據關係中的交叉過濾方向(Cross Filter Direction)決定,PowerBI允許在不修改關係的情況下,編輯Filter和度量值的交互行為,使報表中的不同圖表(Visiualization)選擇性地響應或不響應過濾條件(Filter)。

1,選擇Filter,切換到Format菜單,選擇“Edit Interactions”

2,編輯交互行為

預設情況下,Card圖表的Filter是選中,將其切換到禁止,這樣,選擇Course過濾器中的任何一個選項,都不會影響Card圖表顯示的數據值。

五,在數據建模中,要遵守一定的設計原則

在數據建模中,不僅需要屬性業務需求,而且需要熟悉數據及其關係,遵守一定的設計原則,能夠避免出現一些顯而易見的錯誤:

  • 要根據業務需求,設計報表的過濾條件(Filer)和度量值;
  • 過濾器是數據建模的出發點,根據過濾條件和數據之間內在的關係設計數據模型;
  • 根據數據之間內在的關係,載入數據,保證數據表中不出現臟數據。

 

PowerBI系列的文章目錄:

 

參考文檔:

Power BI 文檔

在 Power BI Desktop 中創建和管理關係


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux cd 命令可以說是Linux中最基本的命令語句,其他的命令語句要進行操作,都是建立在使用 cd 命令上的。所以,學習Linux 常用命令,首先就要學好 cd 命令的使用方法技巧。 1. 命令格式: cd [目錄名] 2. 命令功能: 切換當前目錄至dirName 3. 常用範例 3.1  ...
  • [root data]$ service ntpd stop關閉 ntpd: [失敗] [root data]$ ntpdate cn.pool.ntp.org 18 Dec 15:09:59 ntpdate[11495]: step time server 119.57.127.125 offse ...
  • Logwatch功能介紹 Logwatch是一款Perl腳本編寫的、開源的日誌分析工具。它能對原始的日誌文件進行解析並轉換成結構化格式的文檔,也能根據您的使用情況和需求來定製報告。Logwatch的特點是配置簡單、監控、分析日誌方便,而且可以對某些功能進行定製化。 項目源碼位於https://sou... ...
  • <! "RedHat" "查看系統發行版本" "查看系統內核版本、位數" "CentOS" "查看系統發行版本 cat /etc/issue" "查看系統內核版本、位數 more /proc/version" "Oracle Linux" "查看系統發行版本" "查看系統內核版本、位數" "所有命令 ...
  • 轉自官方網頁:http://www.firewalld.org/documentation/howto/open-a-port-or-service.html How to open port 80/tcp with firewall-cmd: 重啟後才能生效 Reload firewalld ...
  • 命令 以下命令需要在前面加上 sudo 以獲得 root 許可權。 根據實際情況,替換“軟體包名稱”或“字元串”為具體內容。 軟體包維護 apt-get update - 在你更改了/etc/apt/sources.list 或 /etc/apt/preferences 後,需要運行這個命令以令改動生 ...
  • 修改 code 後, 想使用 beyond compare 比對 修改前後的 code (有一包未修改的 code), 若 code 很大, 全部比完,需要花很多時間, Command 此時可以使用 git 與 sed 的命令,濾出修改過的檔案位置, copy 濾出的結果 至 beyond comp ...
  • Java開發環境最基礎的兩個開源軟體是JDK和Maven。 JDK 到 "Oracle官網" 下載相對應的源碼包,這裡我選擇的是:Linux x64系統的jdk 8u131 linux x64.tar.gz。 下載後解壓並將目錄複製到 目錄下: 接著打開 文件,設置$JAVA_HOME、$PATH、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...