Power BI中星型模式的重要性

PowerBI处理同名客户 人丑就要多读书,一看你就不是读书的料我国有14亿人口之多,所以总会遇到和我们重名的人,而且有时还不止一个人,如果想知道有多少和自己重名的,可以用过以下网站查询公安部“互联网+政务服务”平台 (mps.gov.cn)。当然,今天不是要讲怎么查同名人数,也不是为讲怎么给小孩子取个没同名或同名少的名字,而是在数据展示时遇到同名的客户应该怎么展示。我们先简单构造一个测试数据,包含多个同名客户的客户表,及销售表销售额度量销售额 = SUM('销售表'[销售额])这时我们拖动一个表格来看下效果,还是按张三进行了汇总,这 阅读详情

本文翻译自国际Power BI大师Alberto Ferrari 的文章——《The importance of star schemas in Power BI》。在Power BI中创建星型模式是提高性能的好办法,更重要的是,能够保证结果准确!本文对星型模式为何可以解决报告中的某些问题进行了解释。

数据建模新手面临的一个常见的问题是,使用只有一个表的完全扁平的数据模型更好,还是花时间构建合适的星型模式更好(您可以在Introduction to Data Modeling
链接:https://www.sqlbi.com/p/introduction-to-data-modeling-for-power-bi-video-course/ 中找到星型模式的描述)。正如Koen Verbeeck所说,一个经验丰富的建模者的座右铭应该是“用星型模式解决一切!”

下面我们看一个简单的案例来了解使用扁平化的报表返回不准确的数字,而使用星型模式可以将其转换为可靠的分析系统。

要分析的数据模型很简单,一家公司拥有四家Beauty Salon:两家 hair salons和两家nail salons。要分析顾客光临salons的相关信息,比如他们的Gender 和 Job。您需要构建一个简单的报告来分析到店的次数,每个salons按Gender 和 Job进行筛选。在同一报告中,您希望将当前选择的salons的到店次数与所属的组的其他salons进行比较。换句话说,要回答的问题是:与所有同类salons的平均水平相比,某个salons的顾客的Gender 和 Job分布如何?

数据源是一个单独的表,已经包含了所有相关信息。

file

因为该表不包含任何键,并且所有信息都已经存在,所以看起来不需要在其上构建数据模型-一个表就足够了。实际上,一份包含访问次数及其百分比的报告可以得出正确的结果。
file

在这份报告中,我们使用了以下度量:

# Visits := COUNTROWS ( 'Visits' )
% Salon :=
VAR NumOfVisits = [# Visits]
VAR NumOfAllVisitsSameSalon =
    CALCULATE (
        [#Visits],
        REMOVEFILTERS( 'Visits' ),
        VALUES( 'Visits'[Beauty Salon] )
    )
VAR Result = DIVIDE ( NumOfVisits, NumOfAllVisitsSameSalon)
RETURN Result

%Salon是不考虑其他任何筛选条件,通过将到店次数除以该salons的总到店数来实现的目标。

事实证明,第二步更具挑战性。我们想要展示处于同一组( hair和nails)的所有salons中顾客的Gender和Job的分布。第一步是计算当前salons所属的组共有多少到店数。下面的方法并不能计算出正确的数字,尽管它看起来是完全正确的:

#Group Visits :=
CALCULATE(
    [# Visits],
    REMOVEFILTERS ( 'Visits'[BeautySalon] ),
    VALUES ( 'Visits'[Group] )
)

请看下面的结果:

file

这份报告显然是错误的。你可以很容易地检查出总数的错误。根据之前的数据源表的显示,在nails中已经有三位男性,但是明细却不相等。简单来说,这个例子是错误的,原因有二。

第一个原因是“auto-exist”行为。(关于自动存在可以参考这篇文章:https://www.sqlbi.com/articles/understanding-dax-auto-exist/)

第二个原因是模型在没有访问表的情况下,无法在当前的数据模型中找到group和salon之间的关系。当SUMMARIZECOLUMNS在一个名为Nails & C for Beauty Salon和Male forGender的筛选上下文中扫描表格时,它将这两个筛选器合并在一起,防止它找到未被包括在内的Job(WebDevelopment)。

避免“auto-exist”的影响很简单:您需要为Gender 和 Job创建单独的维度,以便一个维度上的过滤条件不会影响其他维度。这个简单的操作可以防止“auto-exist”。

因此,解决这个问题的第一步(这是必要的,但不是最后一步)是创建两个维度:一个是Gender维度,另一个是Job维度。新模型看起来更像一个星型模式。
file

然后,您需要通过维度表中的列而不是事实表中的列来更新矩阵。但是,即使我们删除了“auto-exist”的问题,这仍然不足以解决问题。事实上,这些数字看起来还是一样——仍然是错误的。

file

为了确保不再存在自动存在的问题,您可以通过性能分析器捕获由Power BI执行的查询,对其进行一些清理,如下所示:

DEFINE
    VAR __DS0FilterTable =
        TREATAS( { "Nails & C" }, 'Visits'[Beauty Salon] )
    VAR __DM3FilterTable =
        TREATAS( { "Female", "Male" }, 'Gender'[Gender] )
EVALUATE
SUMMARIZECOLUMNS (
    'Gender'[Gender],
    'Job'[Job],
    __DS0FilterTable,
    __DM3FilterTable,
    "Visits", 'Visits'[#Visits],
    "GroupVisits",'Visits'[# Group Visits]
)

因为SUMMARIZECOLUMNS是通过两个单独的表进行分组和筛选的,所以自动存在不会起作用。通过运行此查询的两个稍微修改过的版本,您可以轻松地再次检查这一点。我们首先引进了IGNORE到度量值中,以避免删除空白行;然后,我们首先按维度(Gender、Job)执行相同的查询分组,然后按事实表中的列执行。

这是对维度进行分组的查询:

DEFINE
    VAR __DS0FilterTable =
        TREATAS ( { "Nails & C" }, 'Visits'[Beauty Salon] )
    VAR __DM3FilterTable =
        TREATAS ( { "Female", "Male" }, 'Gender'[Gender] )
EVALUATE
SUMMARIZECOLUMNS (
    'Gender'[Gender],
    'Job'[Job],
    __DS0FilterTable,
    __DM3FilterTable,
    "Visits", IGNORE ( 'Visits'[# Visits] ),
    "GroupVisits", IGNORE ( 'Visits'[# Group Visits] )
)

结果表明,尽管许多行都显示空白,但返回了Gender和Job的所有组合。

file

这是对事实表中的列进行分组的查询:

DEFINE
    VAR __DS0FilterTable =
        TREATAS( { "Nails & C" }, 'Visits'[Beauty Salon] )
    VAR __DM3FilterTable =
        TREATAS( { "Female", "Male" }, 'Gender'[Gender] )
EVALUATE
SUMMARIZECOLUMNS (
    'Visits'[Gender],
    'Visits'[Job],
    __DS0FilterTable,
    __DM3FilterTable,
    "Visits", IGNORE ('Visits'[# Visits] ),
    "GroupVisits", IGNORE( 'Visits'[# Group Visits] )
)

如您所见,表中不包括没有访问Nails&C的Gender 和 Job。

file

因此,第一步是成功的,auto-exist在这里不再起作用。我们已经知道这一步是必要的,但这仍然不足以解决问题。尽管问题的本质非常接近于auto-exist,但要发现这个问题还是有点难。

我们报告中缺少的行是(male,Web Development)。因为我们有两个维度,即Job和Gender,所以我们知道SUMMARIZECOLUMNS实际上为该组合计算值。尽管如此,它还是空白。我们需要进一步调查以确定原因。

对于组合Gender=Male, Job=Web开发,DAX计算这个度量:

#Group Visits :=
CALCULATE(
    [# Visits],
    REMOVEFILTERS ( 'Visits'[BeautySalon] ),
    VALUES ( 'Visits'[Group] )
)

因此,我们可以扩展完整的表达式,以更好地了解发生了什么:

EVALUATE
{
    CALCULATE (
        CALCULATE(
            [#Visits],
            REMOVEFILTERS( 'Visits'[Beauty Salon] ),
            VALUES( 'Visits'[Group] )
        ),
        'Visits'[BeautySalon] = "Nails & C",
        'Gender'[Gender]= "Male",
        'Job'[Job]= "Web development"
    )
}

内部CALCULATE在外部CALCULATE定义的筛选上下文中计算VALUES函数。由于没有(Male,WebDevelopment)访问Nails&C.,因此VALUES(‘Visits’[Group])返回一个空表,而不是salons所属的组的表。因此,该度量将返回空白。

虽然这种行为非常接近于auto-exist,但这一次完全是我们的锅。与DAX无关。当筛选器上下文中的筛选器集产生一个空结果时,无法查找当前salons属于哪个组,因为在visit表中没有行告诉我们这个信息。换句话说,我们依靠事实表来告诉我们salons属于哪个组。在没有访问表的情况下,无法获得这些信息。

了解问题比找到解决方案困难得多。为避免此问题,我们需要定义一个包含salons及其各自所属组别的数据结构。该表不能是可以被报表过滤的访问表;它必须是一个专门的维度。因此,解决方案的最后一步是使用名为Beauty Salon的表为Beauty Salon建立第三个维度。
file

维度就位之后,我们将切片器与Beauty Salon表的BeautySalon列一起使用,而不是Visits表中的BeautySalon列,然后对DAX代码进行较小的更正:

# Group Visits :=
CALCULATE(
    [# Visits],
    REMOVEFILTERS ( 'BeautySalon'[Beauty Salon] ),
    VALUES ( 'Beauty Salon'[Group])
)

如您所见,REMOVEFILTERS和VALUES函数在维度表上运行,而不是对事实表中的列进行处理。该度量的总体逻辑保持不变。有了这项新度量值,报告现在将显示正确的结果。

file

从DAX的角度来看,在一个有10行数据的模型上发现这个问题是很有挑战性的,但是我们知道在结果中会出现什么数字,这使得问题变得更简单了。不用说,要在一个有数百万行数据的模型上找到这个问题简直是天方夜谈。这就是为什么专家建模师总是遵循以下规则:

  • 始终使用星型模式。
  • 隐藏事实表中的所有列。仅在事实表中显示度量。
  • 仅通过维度公开可见的属性。
  • 使用一眼就能掌控和理解的少量数据对公式进行测试。

这些都是黄金法则。专家建模人员有时会推翻这些规则,但是他们这样做是基于对所处理内容的深入透彻的理解,缺乏经验的建模者常常选择避开规则。如果您想感受一下进入一个完全未经探索和危险的复杂迷宫的刺激,那么这样做是令人兴奋的。转念一想,如果您想为您的客户部署一个合理的模型,那么遵守这些简单的规则是朝着正确方向迈出的非常好的一步。

原文链接:
https://www.sqlbi.com/articles/the-importance-of-star-schemas-in-power-bi/

  • PowerPivot工坊原创文章,转载请注明出处!

如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

【PowerBI】第三节(4): The Star Schema,Duplicate和Reference 1. The Star Schema 1.1 Snowflake Schema Star Schema Dim Table (Multiple tables) Fact Table (Connect Dim Tables) 1.2 应用 The Star Schema 2. 复制Duplicate和引用Reference的区别 2.1 Reference A reference depends on the initial query 2.2 Duplicate A complete copy 阅读详情

相关推荐

PowerBi中Star Schema(星型模型) 和 Snowflake Schema(雪花模型)如何选择?

在使用 Power BI、Tableau 或数据仓库设计时,你必须了解这两个经典的数据建模方法

kwydxm的博客 1683

power bi desktop 知识整理(2)

Zirui0503的博客 437

2.1PowerBI系列之DAX函数专题-DAX函数术语、语法、运算符

(3)度量值:返回标量值。(5)in:表字段 in 表构造函数,in代表比较每一行都创建or条件,表构造函数语法使用大括号。(1)表名:a.不包含特殊字符与空格,直接引用;(2)在DAX公式中使用数据,会自动识别数据类型并进行隐式转换,如果转换失败会报错;(3)函数返回标量值,列,表;(2)列名:a.完全限定列名:表名[列名];(1)计算列的效果:添加一列;(1)导入数据后,每一列的数据类型应一致,否则会报错;(2)计算表:编写公式添加表,公式必须返回表对象。(3)逻辑“与”:&&(4)逻辑“或”:||

qq_33842426的博客 1937

数据脱敏工具

/** * 对字符串进行脱敏操作 * @param str原始字符串 * @param prefix 左侧需要保留几位明文字段 * @param suffix 右侧需要保留几位明文字段 * @param maskStr 用于遮罩的字符串, 如'*' * @return 脱敏后结果 */ public static String desensitized(String str, int prefix, int suffix, String maskStr) { if (s..

一条快死的鱼 1138

Power BI Premium Per User (PPU) 介绍

什么是Power BI PPU 在了解Power BI Premium Per User(以下简称Power BI PPU)之前,先过一下我们所熟悉的License。 Power BI Free. Power BI Pro. Power BI Premium. 我们知道,Power BI Free面向个人,它是免费的,你可以发布报表,但不能创建新的空间以及与同事一同协作,Power BI Pro则允许用户互相分享报表,创建App,并支持增量刷新,以及R可视化等新特性,它面向组织或企业,但按个人收费,价格

DAVIS的博客 2084

Power BI数据建模实战:星型模型、关系配置与模型瘦身

数据建模是Power BI性能与准确性的底层根基,其本质是通过规范化的结构设计,让VertiPaq引擎高效压缩、快速筛选和精准聚合。核心原理在于构建星型模型——以事实表为中心,用整数主键关联维度表,实现列式存储最优压缩;严格配置多对一基数与单向交叉筛选,避免DAX上下文错乱与内存爆炸;再结合时间智能关闭、列/行裁剪等模型瘦身术,显著降低内存占用与刷新耗时。该方法广泛应用于销售分析、IoT日志、财务报表等亿级数据场景,是企业级Power BI落地的必修工程实践。

weixin_28678151的博客 328

在Power BI Desktop中实施星型架构

In this article, you will see how to implement a star schema in Power BI. Microsoft Power BI is a business analytics tool used to manipulate and analyze data from a variety of sources. 在本文中,您将...

culuo4781的博客 1141

【信息科学与工程学】信息科学领域——第一百三十五篇 射频/天线04

1469(家具布局续完)、1470(街道宽度续完)、1471(多层墙体续完)、1472(树叶极化续完)、1473(雨衰动态续完)、1474(沙尘XPD续完)、1475(呼吸监测续完)、1476(地下管道续完)、1477(室内XPR续完)、1478(V2I阴影续完)、1479(金属饰品续完)、1480(簇模型续完):半球壳(R=50mm,厚2mm),材料可选石英(ε_r=3.78,tanδ=0.0001)或聚四氟乙烯(ε_r=2.1,tanδ=0.0003),用FEM离散,140GHz。

weixin_49199313的博客 120

Power BI 傻瓜入门 3. 选择Power BI的版本

您可以从四个产品许可选项中进行选择:Power BI Desktop、Power BI Free、Power BI Pro或Power BI Premium。您可能会挠头,因为Microsoft还在Microsoft网站上展示了其他一些Power BI产品,包括两个版本的Power BI Premium以及Power BI Mobile、Power BI Embedded和Power BI Report Server。如果你感到困惑,你并不孤单。

Martin-Mei的博客 3950

解析星型架构及其对 Power BI 的重要性

星型架构是一种数据仓库模型,它的设计灵感来自于星星。中心的是一个事实表(Fact Table),周围是多个维度表(Dimension Tables),这些表通过外键连接,像星星的光芒一样向外扩散。事实表通常包含数值和度量,如销售金额、时间戳等。而维度表则包含描述性信息,如产品信息、客户信息等。通过这种方式,星型架构能够提供一种简单、清晰的数据模型,方便数据分析和查询。Power BI 是微软推出的一款商业智能工具,旨在帮助用户轻松创建数据报表和可视化。

xueyunshengling的博客 450

Power BI Premium whitepaper v1a

Power BI Premium whitepaper v1a。 微软数据报表工具。适合企业用户。

Power BI 数据模型设计及搭建——星型模型&雪花模型

Power BI 中的数据模型的设计架构,以及两种常用的数据模型:星型模型和雪花模型

WHYbeHERE的博客 3693

power bi官网教程

在线教程 官网介绍power bi应用,全面,详细的介绍了power bi的设计开发,到应用和发布。

Power BI 涨价,PBI Plus 成省钱救星?

数据分析领跑者

Sharewinfo_BJ的博客 2345

Apple 网页 SRP 登录系列文章(四):Hashcash 工作量证明与完整登录流程

本文是Apple SRP登录系列文章的收官之作,重点解析了Apple独有的Hashcash工作量证明机制并展示了完整的登录流程实现。文章详细介绍了Hashcash的安全目的、格式标准、计算核心算法及难度评估方法,特别提供了Python实现代码。同时还讲解了如何动态获取服务器Hashcash参数以及建立容错机制。最后呈现了完整的Apple SRP登录主函数架构,为开发者提供了从理论到实践的全面指导。全文通过代码示例和流程分析,系统性地阐述了Apple安全登录机制的技术细节。

Sayid_Des的专栏 630

实战指南:如何用Frida绕过某梆加固的Anti-Frida检测(附完整脚本)

本文深入剖析了企业级加固方案中的Anti-Frida检测机制,并提供了实战对抗策略。通过分析基于文件系统、内存特征、行为及环境的多层次检测原理,文章详细介绍了如何定位检测逻辑、绕过maps文件扫描、对抗内存与行为特征检测,并附上了针对某梆加固的完整绕过脚本与系统化工程方案。

weixin_42527589的博客 600

Power BI免费版(Free),专业版(Pro)以及增值版(Premium)授权功能对比

主要介绍Power BI免费版(Free),专业版(Pro)以及增值版(Premium)授权功能对比

Fluffy的百宝箱 14万+

python爬虫抖音 个人资料 仅供学习参考 切勿用于商业

本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Tools-Options-HTTPS,如图1红框打钩,HTTPS旁边Connections配置,如图2红框打钩 1.2.再次点击HTTPS栏,点击Actions选择第二个…to ...

dbva7063的博客 1491

DAX :【翻译】自动存在(auto-exist)

自动存在是 DAX 中内置的一项技术,其唯一的目标是避免无用计算,换句话说,它是 DAX 的过滤机制使用的一种优化技术,目的是减少计算值的工作量。 例如,假设有人构建了一份按大陆和国家/地区划分的报告。 在一个数据库中,一个人可能有两大洲和五个国家: 在这些数据上,可以运行一个简单的查询,如下所示: EVALUATE SUMMARIZECOLUMNS ( Geography[Con...

悦光阴的博客 356

C#上位机面试必问30题:机器视觉+工业通信+性能优化(含答案解析)

工业通信:围绕“稳定性”展开,重点答异常处理、断线重连、资源释放;机器视觉:围绕“精度+速度”展开,重点答预处理、ROI、参数优化;性能优化:围绕“UI不卡、内存不泄、效率不低”展开,重点答异步、限流、资源复用;面试加分项:结合实际项目案例(如“我在XX项目中用信号量解决了多设备并发卡顿问题”)。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1509

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 47

Power BI数据建模实战:构建可验证、高性能的星型模型

数据建模是BI系统可信度与性能的底层基石,其本质并非表格连接操作,而是将业务规则结构化表达为维度-事实关系。理解星型模型原理、正确设置关系基数与方向、设计健壮日历表,直接决定DAX计算准确性与报表响应速度。Power BI中90%的‘DAX报错’和‘指标不一致’问题,根源在于建模阶段对业务语义的误读或结构失范。本文聚焦Data Modeling核心实践,覆盖模糊匹配陷阱、多对多处理、非活跃关系激活等高频痛点,助力分析师构建经得起业务追问、支持时间智能与复杂分析的生产级模型。

weixin_29046611的博客 260

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 303

Power BI许可证差异(免费、Pro、PPU、Embedded、Premium)

不可否认,在商业BI软件中Power BI是最强大的,在2023年的Gartner的魔力象限中Power BI又是第一名image.png目前还没有使用Power BI的,甚至已经在用Power BI的企业都会这样的疑问,各个版本间有啥区别,公司应该使用哪个版本最合适。

PowerBI木小桼 4088

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(一)校园网核心交换机配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 3797

嵌入式硬件中AI硬件设计方法与技巧

嘉立创EDA推出AI助手Kimi插件,为PCB设计提供智能支持。该插件具备四大核心功能:AI问答助手可解答各类电路设计问题;元件查询功能直接展示参数和应用场景;智能分析网表可检测潜在问题;电路图识别能解析图纸结构并提供改进建议。用户需通过扩展插件安装,并配置Kimi API密钥后使用。该工具旨在提升工程师的设计效率,减少查阅资料时间,特别适合项目交接和设计自查场景。

嵌入式技术开发 1868
上一篇: DAX实战 | 一个案例带你了解CROSSFILTER
下一篇: 技巧分享 | 折线图的层级下钻
PowerPivotWorks
博客等级 码龄7年 242粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值