创建出色的语义模型是数据分析人员可以在 Microsoft Power BI 中执行的最重要的任务之一。 通过出色地完成这项工作,你可以帮助用户更轻松地理解你的数据,从而使他们和你自己能够更轻松地生成有价值的 Power BI 报表。

出色的语义模型具有以下优点:

  • 数据浏览速度更快。
  • 聚合更易于生成。
  • 报表更加准确。
  • 编写报表所需的时间更少。
  • 报表以后更易于维护。

通常情况下,较小的语义模型包含更少的表,且每个表中用户可以看到的列也更少。 如果从销售数据库中导入所有必需的表,但共计有 30 个表,则用户不会认为其具有直观性。 将这些表折叠为五个表会使语义模型对用户而言更直观,而如果用户打开某个表并找到 100 列,他们可能会觉得无从着手。 删除不需要的列来提供可管理的列数可增加用户查看所有列名的可能性。 在设计语义模型时应该以简洁性为目标

Power BI 允许从具有不同数据源的表中生成关系,它是一个功能强大的函数,使你可以从 Microsoft Excel 中拉取一个表并从关系数据库中拉取另一个表。 然后,你将在这两个表之间创建关系,并将它们视为统一的语义模型。

星型架构

设计星型架构用于简化数据。 这不是简化数据的唯一方法,但它是一种常用方法;因此,每个 Power BI 数据分析人员都应该了解它。 在星型架构中,语义模型中的每个表都定义为一个维度表或事实数据表,如下图所示。
在这里插入图片描述

  • 事实数据表包含观测或事件数据值, 可以包含多个重复值。 例如,对于不同日期的不同客户,一个产品可以在多个行中多次出现。 可以聚合这些值以创建视觉对象。 例如,总销售订单数视觉对象是事实数据表中所有销售订单的聚合。 对于事实数据表,通常会看到填充数字和日期的列。
  • 维度表包含有关事实数据表中数据的详细信息:产品、位置、员工和订单类型。 这些表通过键列连接到事实数据表。 维度表用于对事实数据表中的数据进行筛选和分组。 另一方面,事实数据表包含可度量的数据,如销售额和收入,每一行表示维度表中值的唯一组合。 对于总销售订单数视觉对象,可以将数据分组,以便按产品查看总销售订单数,其中产品是维度表中的数据。

事实数据表比维度表大很多,因为许多事件在事实数据表中发生

如: 数据位于“Employee”和“Sales”这两个表中,如以下语义模型所示。 因为“Sales”表包含可以聚合的销售订单值,所以将其视为事实数据表。 “Employee”表包含特定员工姓名,可用于筛选销售订单,因此它将是维度表。 两个表之间的公用列(即“Employee”表中的主键)为“EmployeeID”,因此,可以基于此列在两个表之间建立关系。

星型架构和基础语义模型是有序报表的基础;在创建这些连接和设计上花费的时间越多,创建和维护报表就越容易。

公用日期表创建

在 Power BI 中创建报表时,一个常见的业务需求是根据日期和时间进行计算。 组织希望了解其业务在几个月、几个季度、会计年度等期间的表现。 因此,正确设置这些时间导向的值的格式至关重要。 Power BI 可自动检测日期列和表;但是,在某些情况下,您需要采取额外步骤才能获取组织所要求格式的日期。
可用于生成公用日期表的方法包括:

  • 源数据
  • DAX
  • Power Query

源数据

源数据库和数据仓库已具有自己的日期表。 如果设计数据库的管理员的工作完成得出色,则可以使用这些表执行以下任务:

  • 确定公司假日

  • 分离日历和会计年度

  • 确定周末与工作日

源数据表已非常成熟,可以立即使用。 如果您有这样的表格,请将其纳入您的语义模型,忽略此部分中概述的任何其他方法即可。

DAX

可以使用 Data Analysis Expression (DAX) 函数 CALENDARAUTO() 或 CALENDAR() 来生成公用日期表。 CALENDAR() 函数根据在函数中作为参数输入的开始日期和结束日期返回连续的日期范围。 或者,CALENDARAUTO() 函数返回根据语义模型自动确定的连续、完整的日期范围。 开始日期被选为语义模型中存在的最早日期,结束日期是语义模型中存在的最晚日期加上已填充到会计月份的数据,您可以选择此会计月份将其作为参数包含在 CALENDARAUTO() 函数中。
在 Power BI Desktop 中,选择新建表,然后输入以下 DAX 公式:

Dates  = CALENDAR(DATE(2011, 5, 31), DATE(2022, 12, 31))

同时,也可以通过Dates这一列来新建新的列表示年份、月份

Year = YEAR(Dates[Date]) # 新建年份列
MonthNum = MONTH(Dates[Date]) # 新建月份列
WeekNum = WEEKNUM(Dates[Date]) # 新建周列
DayoftheWeek = FORMAT(Dates[Date], "DDDD") # 新建星期列

Power Query

可以使用 M 语言(用于在 Power Query 中构建查询的开发语言)来定义通用日期表。

在 Power BI Desktop 中选择转换数据,它会将您引导至 Power Query。 在左侧查询窗格的空白处,右键单击以打开下面的下拉菜单,并在其中依次选择新建查询 > 空查询

在这里插入图片描述
在显示的新建查询视图中,输入以下 M 公式以生成日历表:

= List.Dates(#date(2011,05,31), 365*10, #duration(1,0,0,0))

成功完成该过程后,您会发现自己拥有了一个日期列表,而不是一个日期表。 若要更正此错误,请转到功能区上的转换选项卡,然后选择转换 > 为表

标记为日期表

要将表标记为正式日期表,首先在字段窗格中找到新表。 右键单击表名,然后选择标记为日期表,如下图所示。
在这里插入图片描述

维度表使用

生成星型架构时,将拥有维度表和事实数据表。 事实数据表包含有关事件的信息,例如销售订单、发货日期、经销商和供应商。 维度表存储有关业务实体(例如产品或时间)的详细信息,并通过关系连接回事实数据表。可以将层次结构用作帮助在维度表中查找详细信息的源。 这些层次结构通过数据中的自然分段形成。
在这里插入图片描述
在前面的“日期”列中,日期按年、季度、月和日以详细程度越来越高的方式显示。 你也可以手动创建层次结构。

层次结构

生成视觉对象时,Power BI 会自动输入日期类型的值作为层次结构,当然你也可以手动创建层次结构,层次结构分为:

  • 父子层次结构
  • 平展父子层次结构

父子层次结构

数据库中有一个 Employee 表,该表告知有关员工、其经理和其 ID 的重要信息。 查看此表时,你会注意到“Roy F”在“Manager”列中重复出现多次。 如图所示,多个员工可以拥有相同的经理,这指示经理和员工之间的层次结构。

平展父子层次结构

基于顶级父级查看多个子级的过程称为“平展层次结构”。 在此过程中,你将在一个表中创建多个列,以在同一记录中显示父级到子级的层次结构路径。 你将使用 PATH()(一个简单的 DAX 函数,该函数为每个员工返回管理路径的文本版本)和 PATHITEM()(将此路径分隔为每个管理层次结构级别)。

怎么创建层次结构,参见: TODO

定义数据粒度

数据粒度指数据中表示的详细信息,这意味着数据粒度越多,数据中的详细信息级别就越高。

更改数据粒度以在两个表之间生成关系

假设你正在为销售团队生成报表。 需要使用“Calendar”、“Sales”和“Budget”表生成一段时间内的总销售额和预算的矩阵。 你会注意到,“Sales”表的基于时间的详细信息的最低级别为按天,例如 5/1/2020、6/7/2020 和 6/18/2020。 “Budget”表仅为月级别,例如,预算数据为 2020/5 和 2020/6。 这些表中有不同粒度,需要先对它们进行调节,然后才能在表之间建立关系。
在这里插入图片描述
“Budget”和“Calendar”之间的关系缺失。 因此,需要先创建此关系,然后才能生成视觉对象。 请注意,如果将“Calendar”表中的“Year”和“Month”列转换为新列,并在“Budget”表中进行相同的转换,则可以匹配“Calendar”表中“Date”列的格式。 然后,可以在两列之间建立关系。 要完成此任务,需要连接“Year”和“Month”列,然后更改格式。
在这里插入图片描述

关系和基数

Power BI 中的关系具有方向性 这一概念。 这种方向性在多个表之间筛选数据时起着重要作用。 加载数据时,Power BI 通过匹配列名自动查找数据中存在的关系。 也可以使用管理关系来手动编辑这些选项。

关系

  • 多对一 (*:1) 或一对多 (1: *) 关系

    • 描述一种关系,在这种关系中,一列中某个值的许多实例仅与另一列中的一个唯一对应实例相关。

    • 描述事实表和维度表之间的方向性。

    • 是最常见的方向性类型,也是当您自动创建关系时 Power BI 的默认类型。

  • 一对一 (1:1) 关系:

    • 描述一种关系,在这种关系中,两个表之间只共有某个值的一个实例。

    • 两个表中都需要唯一值。

    • 不建议使用,因为此关系会存储冗余信息,并表明模型设计不正确。 更好的做法是合并表。

  • 多对多关系 (.) 关系:

    • 描述两个表之间共有许多值的关系。

    • 关系中的任一表中都不需要唯一值。

    • 不建议使用,缺少唯一值会引入多义性,用户可能不知道哪一列值指代哪些对象。

交叉筛选器方向: 可以在关系的一侧或两侧筛选数据。

使用单个交叉筛选方向:

  • 关系中只有一个表可用于筛选数据。 例如,表 1 可以按表 2 进行筛选,但表 2 不能按表 1 进行筛选。

  • 对于一对多或多对一关系,交叉筛选方向将从“一”侧开始,这意味着筛选将发生在具有多个值的表中。

使用两个交叉筛选方向或双向交叉筛选:

  • 关系中的一个表可用于筛选另一个表。 例如,可以通过事实表筛选维度表,也可以通过维度表筛选事实表。

  • 将双向交叉筛选用于多对多关系时,性能可能会降低。

除非您完全了解这样做的后果,否则不应启用双向交叉筛选关系。 启用它可能导致多义性、过度采样、意外结果以及性能降低风险。

  • 对于一对一关系,唯一可用的选项是双向交叉筛选。 可以在此关系的任一侧对数据进行筛选,并生成一个含义明确的非重复值。
  • 对于多对多关系,可以通过使用双向交叉筛选选择在单个方向或两个方向上进行筛选。 多对多关系会放大与双向交叉筛选相关联的多义性,因为不同表之间将存在多个路径。 如果您创建度量值、计算或筛选器,则可能会在筛选数据时发生意外后果,并且根据 Power BI 引擎在应用筛选器时选择的关系,最终结果可能会有所不同。

创建多对多的关系

在这里插入图片描述

注意Cardinality的选项为Many to Many

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐