博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
阅读量:6264 次
发布时间:2019-06-22

本文共 4675 字,大约阅读时间需要 15 分钟。

跟大家的交流是我的动力。 :)

 

 

Update 2017/Oct/06:更新了生成日期为度的脚本- #"Changed Type"

Update 2017/Sep/21 :来信的一些童鞋都用事实表(Fact Table)来作为时间维度的计算,对于简单的计算并没有问题,但是对于复杂的涉及到更多的FilterContext的transition的时候,这样的设计往往就不能实现,所以强烈建议单独建一个时间维度表(Date Dimension)---- 这个涉及到一些些data warehousing的一些基础知识。

还等什么,往下瞅瞅!!

 

DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

难度: ★☆☆☆(1星)

适用范围: ★(5星)

这个时间系列想写很久了,今天开始走一小步。也是作为后续关于时间计算文章的基础。    (文末发一个小福利。 )

 

概况:

关于时间序列的计算是一个很(也)常(很)用(大)的topic,而且应用范围很广,譬如计算同比,环比,根据时间序列预测某个值。必不可少的就是在模型里面有一个日期的维度。

PowerBI提供了一个AutoCalendar的函数来生成一个日期的时间表,很好!但它仅此生成一个日期列。

可素,往往我们需要很多其他的日期属性列,譬如:单独的年,月,日,季度,财年,等等。我们可以添加计算列,把它们一个一个加进来,但是我另外一个model也需要这个时间维度表呢?

重复添加计算列,这个活真的比较无趣。有没有什么好方法去避免呐?

这个就是今天的主题:如何用脚本生成时间维度。(How to use script to generate date dimension)

 

应用场景:

以下是几个应用场景:

  • 复用时间维度表
  • 偷懒不想一个个添加时间属性列

 

 

 

最终PowerBI效果显示如下

 

 

要点:

 按下面步骤操作,具体M语言是什么,可以忽略。(下面的属性不够用再参考M语言是什么)

 

 1.PowerBI面板>Edit Query进入Qery Editor> New Source > Blank Query>

 

 

2. Advanced Edictor,贴入文末脚本并保存。

 

 

 

 

3.填入参数,点[Invoke]

 

 4.哇啦,你得到一个时间维度表啦,(*^__^*) 嘻嘻……

 

 

脚本如下:(拿走,不谢

脚本使用M语言写的,如果想修改添加其他的列,参考一下M语言。 (又一种语言,╮(╯▽╰)╭)

1 (StartDate as date, YearsToAppend as number, FinancialYearStartingMonth as number ) => 2 let 3      4     YearsToAppend =  YearsToAppend,  5     FinancialYearStartingMonth=  FinancialYearStartingMonth,  6     StartDate = #date(Date.Year(StartDate), Date.Month(StartDate), Date.Day(StartDate)), 7     // Generate base table 8     Source = List.Dates(Date.From(StartDate),YearsToAppend*365,#duration(1, 0, 0, 0)), 9     Transformed = List.Transform(Source, each Date.ToRecord(_)),10     Tabled = Table.FromList(Transformed,Record.FieldValues,{
"Year","Month","Day"}),11 //Add Full Date Column12 AddDateKey = Table.AddColumn(Tabled,"Date",each Date.FromText(Text.From([Year])&"-"&Text.From([Month])&"-"&Text.From([Day]))),13 //DateBKeyConvert = Table.TransformColumnTypes(Date,{
{"Date", type date}}),14 DateKeyAdded = Table.AddColumn(AddDateKey,"DateKey",each ([Year] * 10000) + ([Month] * 100) + [Day]),15 FullDateNameAdded = Table.AddColumn(DateKeyAdded,"DateFullName",each DateTime.ToText(DateTime.From([Date]),"dd MMMM yyyy")),16 // Calendar Quarter 季度17 CalendarQuarterAdded = Table.AddColumn(FullDateNameAdded, "Calendar Quarter",18 each Number.IntegerDivide(Date.Month([Date])-1,3) + 119 ),20 // Calendar Month Number 年月21 CalendarMonthNumberAdded = Table.AddColumn(CalendarQuarterAdded, "Calendar Month Number",22 each Date.Year([Date]) * 100 + Date.Month([Date])23 ), 24 // Is Week Day 工作日 or 周末25 WeekDayAdded = Table.AddColumn(CalendarMonthNumberAdded, "IsWeekDay",26 each27 if 28 Date.DayOfWeek(DateTime.From([Date]))=Day.Sunday29 or 30 Date.DayOfWeek(DateTime.From([Date]))=Day.Saturday31 then 0 else 1 ),32 // Day Of Week 33 DayOfWeek = Table.AddColumn(WeekDayAdded,"DayOfWeek",each Date.DayOfWeek(DateTime.From([Date]))),34 // Month Name35 MonthName = Table.AddColumn(DayOfWeek,"Month Name",each DateTime.ToText(DateTime.From([Date]),"MMMM")),36 // Day of Week Name37 DayOfWeekName = Table.AddColumn(MonthName,"Day of Week Name",each DateTime.ToText(DateTime.From([Date]),"dddd")),38 39 // Fiscal Year 财年40 FiscalYearAdded = Table.AddColumn(DayOfWeekName,41 "Fiscal Year",42 each 43 if Date.Month([Date]) >= FinancialYearStartingMonth then 44 Date.Year([Date]) + 1 45 else 46 Date.Year([Date])47 ),48 // Fiscal Month 财年月份49 FiscalQuarterAdded = Table.AddColumn(FiscalYearAdded,50 "Fiscal Quarter",51 each 52 if Date.Month([Date])>=FinancialYearStartingMonth then 53 Number.IntegerDivide((Date.Month([Date])-FinancialYearStartingMonth),3) + 154 else55 Number.IntegerDivide((12 + Date.Month([Date])-FinancialYearStartingMonth),3) + 156 ),57 58 #"Changed Type" = Table.TransformColumnTypes(FiscalQuarterAdded,{
{
"DateFullName", type text}, {
"DateKey", Int64.Type}, {
"Calendar Quarter", Int64.Type}, {
"Calendar Month Number", Int64.Type}, {
"IsWeekDay", type logical}, {
"DayOfWeek", Int64.Type}, {
"Month Name", type text}, {
"Day of Week Name", type text}, {
"Fiscal Year", Int64.Type}, {
"Fiscal Quarter", Int64.Type}, {
"Day", Int64.Type}, {
"Month", Int64.Type}, {
"Year", Int64.Type}, {
"Date", Date.Type}})59 in60 #"Changed Type"

 

转载于:https://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-How-to-generate-date-dimension.html

你可能感兴趣的文章
PXC 5.7 mysqldump: Error 2013
查看>>
HID Global荣膺 RFID行业最有影响力国际品牌奖
查看>>
上海市政府颁布智能汽车牌照,蔚来汽车成首批获此资格企业
查看>>
如何让机器理解汉字一笔一画的奥秘?
查看>>
云栖社区2017中国开发者调查报告
查看>>
记录CDH Spark2的spark2-submit的一个No such file or directory问题
查看>>
安装tomcat-7.0.61图文
查看>>
NEG+SBB指令组合的用处
查看>>
802.11bgn信道划分及WirelessMon规划频段
查看>>
LeetCode Array
查看>>
在IE6下发生Internet Explorer cannot open the Internet site错误
查看>>
jdbc数据源连接数据库和jdbc连接数据库
查看>>
bootstrap-面板中嵌套表格
查看>>
service password-encryption,enable secret,enable password区别
查看>>
小鹏汽车获得造车新势力第一块牌,提车的却不是消费者
查看>>
单节点Nginx+FastDFS安装配置<1>
查看>>
自制jquery可编辑的下拉框
查看>>
项目管理流程
查看>>
七鑫易维彭凡演讲实录:眼球追踪技术让VR更“人性”
查看>>
H3 BPM门户操作说明及实例介绍
查看>>