简介

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

补充:

还可以在数据库中建立物理维度表。

创建日期维度表:

CREATE TABLE [dbo].[DimDate]([datekey] [int] NOT NULL,[date_name] [date] NOT NULL,[the_Year] [int] NULL,[year_name] [nvarchar](10) NULL,[the_quarter] [int] NULL,[quarter_name] [nvarchar](10) NULL,[the_month] [int] NULL,[month_name] [nvarchar](10) NULL,[the_week] [int] NULL,[week_name] [nvarchar](10) NULL,[the_year_quarter] [int] NULL,[year_quarter_name] [nvarchar](10) NULL,[the_year_month] [int] NULL,[year_month_name] [nvarchar](10) NULL,[the_year_week] [int] NULL,[year_week_name] [nvarchar](10) NULL,[the_week_day] [int] NULL,[week_day_name] [nvarchar](10) NULL,[week_day_type] [nvarchar](10) NULL,CONSTRAINT [PK_DimDate] PRIMARY KEY CLUSTERED
([datekey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

也可以使用存储过程在物理表中生成时间维度表:

USE [DW]
GO
/****** Object:  StoredProcedure [dbo].[SP_CREATE_TIME_DIMENSION]    Script Date: 2017/12/8 18:34:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_CREATE_TIME_DIMENSION]
@begin_date  nvarchar(50)='2016-01-01' ,
@end_date    nvarchar(50)='2017-12-31'
as
/*SP_CREATE_TIME_DIMENSION: 生成时间维数据begin_date: 起始时间end_date:结束时间
*/
declare
@dDate date=convert(date,@begin_date),
@v_the_date varchar(10),
@v_the_year varchar(4),
@v_the_quarter varchar(2),
@v_the_month varchar(10),
@v_the_month2 varchar(2),
@v_the_week varchar(2),
@v_the_day varchar(10),
@v_the_day2 varchar(2),
@v_week_day nvarchar(10),
@adddays int=1;
WHILE (@dDate<=convert(date,@end_date))
begin
set @v_the_date=convert(char(10),@dDate,112);--key值
set @v_the_year=DATEPART("YYYY",@dDate);--年
set @v_the_quarter=DATEPART("QQ",@dDate);--季度
set @v_the_month=DATEPART("MM",@dDate);--月份(字符型)
--set @v_the_month2=to_number(to_char(dDate, 'mm'));--月份(数字型)
set @v_the_day=DATEPART("dd",@dDate);--日(字符型)
--set @v_the_day2=to_char(dDate, 'dd');
set @v_the_week=DATEPART("WW",@dDate);--年的第几周
set @v_week_day=DATEPART("DW",@dDate); --星期几
INSERT INTO [dbo].[DimDate]([datekey],[date_name],[FiscalQuarter],[FiscalYear],[FiscalSemester],[FiscalWeek],[the_Year],[year_name],[the_quarter],[quarter_name],[the_month],[month_name],[the_week],[week_name],[the_year_quarter],[year_quarter_name],[the_year_month],[year_month_name],[the_year_week],[year_week_name],[the_week_day],[week_day_name],[week_day_type])VALUES(@v_the_date,@dDate           ,@v_the_year,'Y'+convert(nvarchar(10),@v_the_year),@v_the_quarter,'Q'+convert(nvarchar(10),@v_the_quarter),@v_the_month,'M'+convert(nvarchar(10),@v_the_month),@v_the_week,'WK'+convert(nvarchar(10),@v_the_week),@v_the_year*100+@v_the_quarter,'YQ'+convert(nvarchar(10),(@v_the_year*100+@v_the_quarter)),@v_the_year*100+@v_the_month,'YQ'+convert(nvarchar(10),(@v_the_year*100+@v_the_month)),@v_the_year*100+@v_the_week,'YQ'+convert(nvarchar(10),(@v_the_year*100+@v_the_week)),@v_week_day,'WD'+@v_week_day,case @v_week_day-1
when 6 then '休息日'
when 0 then '休息日'
else '工作日' end);set @dDate=dateadd(day,@adddays,@dDate);
continue
if @dDate=dateadd(day,-1,convert(date,@end_date))
break
end

转载于:https://www.cnblogs.com/vitas/p/7064280.html

PowerBI 应用时间智能(生成日期表)相关推荐

  1. 盘一盘 QuantLib 系列 2 - 生成日期表

    本篇是该系列的第二篇: 盘一盘 QuantLib 系列 1 - 日期和日历 上篇已经举例如何在日期 (old_date) 上加减一个期限得到一个新日期 (new_date),该日期没有经过调整可能是一 ...

  2. dax powerbi 生成表函数_PowerBI 应用时间智能(生成日期表)

    简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随 ...

  3. 22.4.2_mysql自动生成日期表(按年份)

    1.应用场景 有时候,需要自动生成某一年的日期表(比如用于录入当年的法定节假日,或者其他需要生成一整年只含日期数据的空表,方便以后补充) 2.代码 例如:需要生成2008年的日期表 2.1. 前期准备 ...

  4. mysql 日期列表_MySQL 生成日期表

    1.创建一个num表,用来存储数字0~9 CREATE TABLE num (i int); 2.在num表中生成0~9 INSERT INTO num (i) VALUES (0), (1), (2 ...

  5. html生成日期表,如何从此HTML表格提取日期?

    其他人已经指出,您希望/s选项使.匹配换行符,以便您可以将逻辑行边界与.*交叉.您可能还需要非贪婪.*?: use v5.10; my $html = < Activation Date: 10 ...

  6. 如何获取当日日期_Power BI时间智能函数如何处理2月29日的?

    ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,PowerBI时间智能函数是如何处理不规则日期的对比数据的. 以一个模拟的订单表数据为例 ...

  7. access month函数用法_掌握时间智能函数,同比环比各种比,轻松搞定!

    时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中可以用CALCULATE来写个度量值[上年同期], = CALCULATE( ...

  8. 函数周期表丨时间智能丨表丨DATESBETWEEN

    DATESBETWEEN函数 DATESBETWEEN函数隶属于"时间智能函数",属于"表"函数.可以用作生成固定范围的日期,也可以用来作为限定条件来对聚合计算 ...

  9. 函数周期表丨时间智能丨表丨DATESINPERIOD

    DATESINPERIOD函数 DATESINPERIOD函数隶属于"时间智能函数",属于"表"函数.这个函数的功能很强大,用途方面也是比较广泛的. 用途1:可 ...

最新文章

  1. 不错的秒杀系统架构分析与实战!
  2. Oracle 日志文件
  3. 解决OracleDBConsoleorcl不能启动【转】
  4. JDK 14:CMS GC是OBE
  5. C++之操作符重载探究(七):==运算符重载
  6. 那年学过的web后端笔记
  7. YISplashScreen
  8. 077 logging模块
  9. VC2013同一个工程生成的exe文件显示不同的图标
  10. 【学习】——提问的智慧
  11. Protel99SE教程(一)——原理图封装
  12. javaGUI学习1:GUI框架,工具介绍
  13. Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。
  14. 每年都有几个研究生,被“爸爸”逼得跳楼
  15. 数字化助力生产制造管理:专项生产管理系统
  16. 【机器学习线性代数】10 相似对角矩阵:漂亮的最简形式
  17. 免费发布友情链接的渠道
  18. 如何基于磁盘 KV 实现 Bitmap
  19. 2022年湖北荆门助理工程师职称评审条件是什么呢? 甘建二
  20. 责任中心(成本中心、利润中心、收入中心、费用中心和投资中心)

热门文章

  1. systemctl自定义service
  2. matplotlib简单使用
  3. 转帖Masonry介绍与使用实践(快速上手Autolayout)
  4. 【转】linux内核态和用户态的区别
  5. Visual C++线程同步技术
  6. Active Report 紙張設置小結
  7. 基于DPDK+VPP实现高性能防火墙
  8. 移动和云环境下的报文传输流程--理解DNS解析、CDN资源下发、公网传输流程、数据中心网络
  9. MemoryRecords分析
  10. 联想笔记本连不上手机热点_购买低配笔记本电脑的烦恼:实际重装笔记本系统的辛酸血泪史...