zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

如何应对极度刁钻的甲方:Power BI处理非结构化流数据集思路

2023-04-18 16:17:22 时间

本文提供了PowerBI处理非结构化数据的新思路,单张表构建多维度的复杂报告;

本文提供的方法配合流数据集可以实现无限刷新、实时更新的复杂报告;

甲方爸爸的要求

有这么一个场景:

甲方提供了一个带数据的PowerBI模型,只有一张表:

要求只有一个:

不允许对数据做任何修改,不允许新建表、新建列、修改数据格式、按列排序等操作,也不允许设置自动日期智能:

也就是说,对于这个模型,只能写度量值,然后在报告中呈现,不能有任何其他操作。要求最终呈现结果:

本来很简单的一个事,添加一个日期表,2分钟搞定,为啥要这么麻烦呢?

甲方嘛,咱也不敢说,咱也不敢问。

收人钱财替人消灾

很明显这个数据表跟我们之前接触的表很不同,因为它并不是结构化的。这张表单看前三列是结构化的销售记录表:

单看后5列也是结构化的日期表:

但是放在一起这是什么操作?

面对这么无理合情合理的要求,我们先拖个表看看情况吧:

嗨,连看也不用看,肯定不对,不能这么直接来筛选。

我们来拆解一下:

首先拖个年月序号:

数据表本质上是前三列,它一定不能被这个年月序号直接筛选,所以写度量值的时候一定要ALL掉。

后面的日期表中包含了所有销售日期,因此我们可以用日期列去匹配数据表的签单日期,从而获得每一天的销售额,然后相加就是本月的销售记录:

我们直接写度量值:

sales.month = 
//首先创建一个只包含日期列的表
var days_table=
ADDCOLUMNS(
    VALUES('Table'[日期ID]),
    "formate_day",
    FORMAT('Table'[日期ID],"yyyy-mm-dd")
)
//然后添加列,计算每一天的sales
//这里在VAR中又加了一个var,为了在虚拟表中计算匹配日的sales
var sales_day=
ADDCOLUMNS(
    days_table,
    "sales",
    var thisday=[formate_day] 
    return 
    CALCULATE(
        [sales],
        FILTER(
            ALL('Table'),
            FORMAT('Table'[签单时间],"yyyy-mm-dd")=thisday))
)
//累加求和
var sales_month=SUMX(sales_day,[sales])
return sales_month

拖入表中:

ok!

度量值其实并不是很难写。

只是我们很少会遇到这样的数据表,哪怕遇到这样的数据表,我们也不会遇到这样的要求。

那为什么学谦还要写这篇文章呢?

谁是甲方爸爸

正如昨天的文章中说的:

从Power Automate到Power BI实时流数据集:翻山越岭的问题解决

在流数据集中我们是没有办法对数据进行任何的修改,不允许新建表、新建列、修改数据格式、按列排序等操作,也不允许设置自动日期智能:

所以这个甲方爸爸正是:流数据集。

流数据集的优点非常强,在仪表板中能够实时显示数据,完全自动化刷新,可以解决大量的对于时间序列敏感的数据。

但是缺点也非常明显,那就是无法添加数据表获取信息以外的维度,尤其是绝大部分数据的日期同时包含了时间信息:

我们根本无法做到对于更大周期的比如日、周、月的数据分析与各种对比。

本文解决了这个问题。

无限刷新

甚至,我们继续往下想,一个拥有多张数据表、多张维度表的模型,我们完全可以将其合并为一张表,在不同列上显示。

然后通过以上的方式,构建出完全相同的模型。

不要忘了,这一切都是基于流数据集来实现。回想一下, 流数据集的优点:

实时更新!

自动刷新!