简介
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] & " " & [FullYear] |
|
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
PowerBI 应用时间智能(生成日期表)的更多相关文章
-
MySQL 如何生成日期表
MySQL 如何生成日期表 在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表 ...
-
PowerBI 引入时间智能
简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随 ...
-
sql生成一个日期表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
-
数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!
https://zhuanlan.zhihu.com/p/55841964 时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中 ...
-
数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?
https://zhuanlan.zhihu.com/p/109964336 今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...
-
一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
-
DAX和Power BI中的参考日期表
本文使用Power BI模板描述DAX中的引用Date表,可以在Analysis Services模型中使用相同的技术.在Dax Date Template页面下载最新版本的模板. 为什么引用Date ...
-
【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
-
Sqlserver存储过程生成日期维度
话不多说,之前已经有一篇日志是利用oracle的存储过程生成日期维度表,接下来我们就用sqlserver来实现这个操作,如下面的步骤所示 1:创建日期维度表(Dim_time) USE [DW] GO ...
随机推荐
-
Python swapcase()方法
首先,要明白Python swapcase() 方法用于对字符串的大小写字母进行转换. 其次,了解swapcase()方法语法:str.swapcase() 返回值:返回大小写字母转换后生成的新字符串 ...
-
防止sql注入。xss攻击 方法
//防止sql注入.xss攻击 /** * 过滤参数 * @param string $str 接受的参数 * @return string */ publ ...
-
Nginx高性能服务器安装、配置、运维 (5) —— Nginx虚拟主机配置
六.Nginx虚拟主机配置 建立基于域名的虚拟主机: (1)建立基于域名的虚拟主机配置文件(以abc.com为例): (2)更改虚拟主机配置文件: 更改配置如下(更改部分即可): server { l ...
-
form表单上传文件使用multipart请求处理
在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——spring MVC其中的一个优势.Spring通过对Serv ...
-
Redis各种数据类型的应用场景
redis是一种key values形式的非关系型数据库,通过内存存储,也可以把数据持久化到本地文件中. redis支持丰富的数据类型,String,list,set,zset,hash,下面说一下各 ...
-
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...
-
2018牛客网暑期ACM多校训练营(第一场)D Two Graphs(图)
题意 给两个图G1和G2,求G2的子图中与G1同构的数目. 分析 首先n=8,那么n!的算法问题不大.枚举G1的每个点,在G2中找同构的顶点序列.需要注意的是G1存在自同构的情况,所以对G1本身进行一 ...
-
阿里云服务器安装SQLServer本地无法远程访问
新买的阿里云服务器,安装上sqlserver2012,本机连接测试没有问题,但是回到本地,使用ip远程连接报错. 尝试了网上各种办法,都是失败.最后找到原因,原来在阿里云的控制台上有设置: 首先进入安 ...
-
Chart-template
ylbtech-Chart: 1.返回顶部 1-1. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 ...
-
es6Math对象新增的方法
Math.trunc() Math.trunc方法用于去除一个数的小数部分,返回整数部分. 对于没有部署这个方法的环境,可以用下面的代码模拟. Math.trunc = Math.trunc || f ...