PowerBI 应用时间智能(生成日期表)

简介

Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大、易于使用。其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘。

但是几乎所有的BI都需要展示如何随时间改变KPI。因此我将会介绍一个帮助我们使用事件元素来分析数据的关键功能。在PowerBI Desktop 中叫做“time intelligence”。应用这种时域分析法能是商业智能中基本的数据表现形式。毕竟公司想要知道的无非就是今年的业绩相比去年如何以及取得了何种进步。

“Time intelligence”将需要一个日期表,花费一定的时间去创建一个成功数据模型的核心就是这个表。然后日期表必须与主数据中随时间变化的日期字段进行关联。需要作如下几种事情:

  • YearToDate, QuarterToDate, 和MonthToDate 的计算
  • 比较之前的年、季、月
  • 回滚一段时间的聚合,比如最近三个月的累加。
  • 比较平行时间段,比如与之前一年相同的月份。

当使用随时间进行的数据分析的时候,很可能要使用DAX函数。为了更好地理解,我们将介绍如何创建日期表,然后看一下几种不同的分析时间的计算,最后加入这些类型道数据模型中。为了测试我会使用一个excel作为PowerBI Desktop 的文件数据源。

创建并且应用日期表

对于智能时间,至少需要一个包含不间断时间范围的日期表,并且开始时间的最小值是源数据中的最小日期,结束日期至少等于源数据中的最大值。实践中,需要创建一个表,开始日期是最早日期的1月1日而最大日期应该是数据源日期的上一年的12月31日。一旦你创建了这个表,就能连接数据模型中的含有时间字段的表,然后拓展时间相关的分析函数。

1.创建日期表

应用时间的前提就是创建日期表。下面步骤说明使用DAX创建表的过程:

1 - 打开PowerBI Desktop文件C:\PowerBiDesktopSamples\PowerBIDataModel.Pbix.

2 - 切换左侧的tab,选择第二个Data如下图所示。

3 - 点击左上方的Modeling按钮,然后点击新建表按钮。表达式“表=”将出现在公式栏里面,

4 - 把Table替换成DateDimension

5 - 输入DAX函数CALENDAR("1/1/2012","31/12/2016"),然后回车或者对勾。前一个时间是dates表的开始时间,后一个时间是结束时间,公式栏内容:DateDimension = CALENDAR( "1/1/2012", "31/12/2016" ).

6 - 回车后,创建了一个单列表,表中的内容就是2012-01-01到2016-12-31,所有日期。

7 - 编辑表头,改列名称为DateKey,结果如下所示:

8 - 点击添加新列按钮或者右键添加新列,新列将会出现在现存列右侧。

9 - 在公示栏输入“FullYear = YEAR([DateKey])”。

10 -  再添加如下19个列公式。如下:

列标题 公式 注释
ShortYear VALUE(Right(Year([DateKey]),2)) 取后两位数字年
MonthNumberFull FORMAT([DateKey], "MM") 月份取两位数,不足的前面补0
MonthFull FORMAT([DateKey], "MMMM") 月份展示名称
WeekNumber WEEKNUM([DateKey]) 以下自行测试
MonthAbbr FORMAT([DateKey], "MMM")  
WeekNumberFull FORMAT(Weeknum([DateKey]), "00")  

DayOfMonth


DAY([DateKey])

 

DayOfMonthFull


FORMAT(Day([DateKey]),"00")

 

DayOfWeek


WEEKDAY([DateKey])

 

DayOfWeekFull


FORMAT([DateKey],"dddd")

 

DayOfWeekAbbr


FORMAT([DateKey],"ddd")

 

ISODate


[FullYear] & [MonthNumberFull] & [DayOfMonthFull]

 

FullDate


[DayOfMonth] & " " & [MonthFull] & " " & [FullYear]

 

QuarterFull


"Quarter " & ROUNDDOWN(MONTH([DateKey])/4,0)+1

 

QuarterAbbr


"Qtr " &ROUNDDOWN(MONTH([DateKey])/4,0)+1

 

Quarter


"Q" &ROUNDDOWN(MONTH([DateKey])/4,0)+1

 

QuarterNumber


ROUNDDOWN(MONTH([DateKey])/4,0)+1

 

QuarterAndYear


DateDimension[Quarter and Year]

 

MonthAndYearAbbr


DateDimension[MonthAbbr] & " " & [FullYear]

 

QuarterAndYearNumber


[FullYear] & [QuarterNumber]

 

YearAndWeek


VALUE([FullYear] &[WeekNumberFull])

 

YearAndMonthNumber


Value(DateDimension[FullYear] & DateDimension[MonthNumberFull])

 

展示如下:

创建所有这些表现时间的的目的就是早晚有一天会用到这些日期来展示报表、聚合指标、展示数据。任何有时间元素的表都可以按照这个新增表中的时间转换聚合来可视化数据。这里你不需要担心是否需要额外的列,因为还可以动态添加你需要的时间元素。

在日期表中引入列排序

现在需要看一下如何排序。典型的例子就是月份排序。如果你打算展示MonthFull 或者MonthAbbr 列,那么将看到月份(month)出现在轴标签里面或者按字母排序的列里面。

为了避免最后再去调整日期表,可以通过应用特定的日期元素来排列其他列,如下:

1 - 点击打算使用其他的列来排序的列(比如Monthfull) ;

2 - 点击Modeling下方的排序按钮,其他列的名称将会出现,如下图所示:

3 - 选择打算按照排序的列(MonthNumber);

这里并不能立即显示出任何不同,但是当在仪表盘中使用任何你已经调整过的日期列时,它们将会根据排序列进行数据排序。

下表提供给你需要的信息来扩展你创建的数据表以便于所有的日期元素都能被正确排序。

Column Sort By Column

MonthAbbr


MonthNumber


DayOfWeekFull


DayOfWeek

DayOfWeekAbbr DayOfWeek
Quarter And Year QuarterAndYearNumber
FullDate DateKey
MonthAndYearAbbr YearAndMonthNumber
MonthAndYear YearAndMonthNumber

日期表技巧

当引入时间智能后,一定要遵守两个基础原则。

  • 日期范围必须是连续的。
  • 在数据模型中数据范围一定是包含所有使用的其他表中的日期。

一旦你知道你数据中的最大值和最小值日期就可以使用CALENDAR来生成日期,即使两个值在不同的表里面如下:

DateDimension = CALENDAR(MIN(‘Stock‘[PurchaseDate]),  MAX(‘Invoices‘[InvoiceDate]))

或者,你可能更喜欢日期维度通过全年的数据,在这种情况下,公式可以这样创建表:

DateDimension = CALENDAR(STARTOFYEAR(MIN(‘Stock‘[PurchaseDate])), ENDOFYEAR(MAX(‘Invoices‘[InvoiceDate])))

这个公式扩展了DAX的计算,两个计算年的公式也是极其有帮助的:

  • StartOfYear() - 这个公式得出最小的年份。
  • EndOfYear() - 这个公式得出最大的年份

注意

这种日期范围的主要优点在于随着数据源的变化自动更新。因此如果Stock 或 Invoices表数据源扩展了新的数据并且在原有日期外的,那么这个时间维度表也会自动变化来包含这部分新增数据的部分。

这里的可以给大家一个小技巧,不需要每次都去创建这个日期表,可先创建一个空的模型,里面只有日期表,结束和开始日期是手填写的,然后加入所有其他列,接下来复制这个模板文件,以后每次使用都以这个模板文件为基础创建。只需要替换手动填写的日期即可。

向数据模型中加入日期表

现在你有了一个日期表,可以与你的数据模型进行整合以便于开始应用这些智能时间。

1 - 点击关系视图的图表来展示数据模型中的表

2 - 点击管理关系按钮,对话框会出现。

3 - 点击新建按钮,创建关系。

4 - 在对话框顶部选择时间维度表。

5 - 点击DateKey列选择。

6 - 在时间维度表下面的下拉框中选择Invoice表。

7 - 再点击InvoiceDate列选择,对话库如下:

8 - 点击Ok,新的表关系就建立了

9 - 点击关闭,时间维度表就与Invoice表建立了关系。

注意 为了时间智能在PowerBI中能够正确使用一定要保证日期表和数据表中的数据类型是date或者datetime。

应用时间智能

所有的准备工作都已经完成了,接下来就看如何使用DAX实现随着时间变化来计算指标。

YearToDate, QuarterToDate, 和MonthToDate 运算

首先,让我们解决一个简单但是频繁的需求:计算月累计、季度累计、和年累计的销售数字。

这个例子中三个函数是很相似的。因此我只解释第一个月累计,然后创建下面两个用复制黏贴的方式。

1 -  在数据视图中选择Invoices表,然后点击新建测量;

2 -  在公式栏用MonthSales替换Measure ;

3 - 输入这个公式MonthSales = TOTALMTD(SUM(InvoiceLines[SalePrice]),DateDimension[DateKey])。

MonthSales = TOTALMTD(SUM(InvoiceLines[SalePrice]),DateDimension[DateKey])

4 - 回车或者点击对勾完成公式

现在可以复制这个公式,生成两个新的公式用来表示季度销售和年度销售日期公式如下:

QuarterSales = TOTALQTD(SUM(InvoiceLines[SalePrice]),DateDimension[DateKey])

YearSales = TOTALYTD(SUM(InvoiceLines[SalePrice]),DateDimension[DateKey])

三个公式分别使用了Totalmtd()、Totalqtd和Totalytd来聚合时间其他参数是一样的。

结果如下:

正缩减,每个月的销售数字随着累加到季度销售数字中,最后还要加到年度销售数字中。还要注意整个排序是按照monthfull来排序的,其实是按照MonthNumber 进行排序。

总结

在这个例子中,我使用了Invoices表来测试仅仅因为这里存储了很多指标数据,当然你也可以选择其他表来尝试这个智能时间的应用。它不仅方便了对于数据的分类和比较,更提供了一种潜在的排序和聚合。

时间: 2024-11-07 21:32:43

PowerBI 应用时间智能(生成日期表)的相关文章

MySQL 如何生成日期表

在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表的步骤 1.创建一个num表,用来存储数字0~9 1 CREATE TABLE num (i int); 结果如下: 2.在num表中生成0~9 1 -- CREATE TABLE num (i int); 2 INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (

PowerBI 引入时间智能

简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随时间改变KPI.因此我将会介绍一个帮助我们使用事件元素来分析数据的关键功能.在PowerBI Desktop 中叫做“time intelligence”.应用这种时域分析法能是商业智能中基本的数据表现形式.毕竟公司想要知道的无非就是今年的业绩相比去年如何以及取得了何种进步. “Time intel

MySQL 生成日期表

1.创建一个num表,用来存储数字0~9 CREATE TABLE num (i int); 2.在num表中生成0~9 INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); 3.生成一个存储日期的表,datalist是字段名 CREATE TABLE if not exists calendar(datelist date); 4.生成并插入日期数据 INSERT INTO calendar(d

一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法,当然自己使用Excel用公式做一个也很快,八仙过海各显神通.我对C#比较了解,就用自己最了解的方式做了一个.大家可以自己扩充,或者可以把需求提供我,我统一完善.比如下面这个表(来自一个Power Pivot课程). 本文原文地址:http://www.cnblogs.com/asxinyu/p/P

mysql生成日期的辅助表

为了解决mysql按日期分组查询统计的时候,没有数据补0.可以生成连续的时间表格来辅助查询 CREATE TABLE num (i int);-- 创建一个表用来储存0-9的数字INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的数字,方便以后计算时间 * 生成日期 CREATE TABLE num (i int);-- 创建一个表用来储存0-9的数字 INSERT INTO n

2016.6.3类型强制转换,连接,生成数字表,子查询

--日期问题select *from orders where OrderDate > '20030525'--字符串表示日期 --cast  强制转换select *from orders where OrderDate >cast( '20030525' as datetime) --datepart 取日期中的一部分select getdate()--计算机当前的时间 select getdate(),    datepart(year,getdate()),    datepart(m

连续12天的加班工作总结-根据客户选择来生成后续表单页面

今天终于不加班了!!!让我先撒花 高呼万岁!! 其实 这样的加班工作 有的时候真的挺没有效率的 有几次晚上 我是真的真的 感觉很累了 但是想到项目的进度 我还是默默的抓紧赶 由于有保密问题 没有代码 就谈谈遇到的问题 主要是两个需求的改变,为某行的app的 travel insurance 模块增加一个新功能 CR1 就是当用户购买保险的时候增加帮 friend or parent 购买  首先通过不同的customer 的类型 来显示是 是给 friend 购买还是 parent购买 然后出现

hibernate 自动生成数据库表

只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update</property> update:表示自动根据model对象来更新表结构,启动hibernate时会自动检查数据库,如果缺少表,则自动建表:如果表里缺少列,则自动添加列. 还有其他的参数: create:启动hibernate时,自动删除原来的表,新建所有的表,所以每次启动后的以前数据都会丢失.

时间类和日期类派生出时间日期类

今天再写一个多重继承的应用实例,时间类和日期类派生出时间日期类 程序代码 #include <iostream> using namespace std; class Date//日期类 { public: //构造函数 Date(int y = 0, int m = 0, int d = 0); //设置日期 void SetDate(int y,int m,int d); //打印日期 void PrintDate() { cout<<year<<"年&q