Power BI之DAX神功:第4卷第22回 计算数据的连续次数
今天是DAX神功主线剧情最后一集,我先做总结:
关于DAX原理是不是骗人的,这是相对论证不是绝对论证。
如果只是完成这项工作,我在PowerQuery M函数中讲过,Table.Group第四参数就搞定了。
对连续日期分组:https://www.bilibili.com/video/BV1cL4y1i7EH
对连续内容分组:https://www.bilibili.com/video/BV12f4y1K7bD
关于计算最大连续次数根本就没有网上说的那么简单,他们用的表都是做好一半了,然而你的表并不是那样的。在PowerQuery中数据清洗很简单,到了DAX中可就没有那么容易了。网上你能看到的原始表格基本就是下面两种:

就好比《DAX神功》第3卷第2回讲父子层级时,父子层级的表难到你要手工敲出来吗?我的方法不一定是最好的,可能慢一些,但是我将这项工作交给计算机来做。
有大神说过:在PowerQuery中处理后再送到DAX中分析,由于往往在用户选择以后的计算无法提前预知,不能做到动态,使用PowerQuery处理后再分析的人就是没有入门DAX的人。
但是你时刻要明白一个道理,你主业是做什么的?你是数据分析师、BI总监那要用专业的方法来要求你。你是做人力、财务、老师、医生。。。。我个人认为你应该先做好本职工作,数据分析只是你的一项工具,就像做饭一样,不要本末倒置。如果我是一名高三教师,我教出来的学生本科率0%,但是我的PowerBI玩的好,我会动态,这就可笑了。每个人的精力是有限的,很多时候,你需要快速完成一项分析,而不是设计一个项目。
当年欧阳峰临终前对杨过说,如果我真的和洪七公打起来,我打不过他的打狗棒法,我虽然破解了,可是实战中哪有那么多时间去破解?这句话古天乐可以做证。
一、计算最大连续日期天数
Ps: 日期也是数字,所以日期连续天数和数字连续次数方法相同
今天我们就拿Sheet1这张表为例展开分析:(如下图所示)

你用网上的方法,能不能算出这张表的最大连续天数呢?红色字体连续4天,紫色字体连续3天,蓝色字体连续2天,最大连接天数4天。肉眼看出来的不算数,让你用DAX公式做。我于2021年11月14日答网友问的视频中讲了使用PowerQuery M函数《对连续日期分组》,Table.Group第4参数可以将连续相同的元素分在一组,但是很多人喜欢来DAX中做,安排!
声明:我的方法不一定是最好的,网上看到很多言论,认为谁的代码慢谁就是坑人误导人,1999年的电脑比现在的慢,难到当年的Intel和AMD都是坑人误导人?谁不是一步一步成长起来的?
其实解决这个问题一个度量值就搞定了,但是我们要逐步分析,让你做到举一反三
【1】建立动态日期表
因为没有2021/1/8,这造成了上一个连续区间与下一个连续区间重合
动态日期表,我们只需要一个Date列
// 代码不用解释,CALENDAR(开始日期,结束日期) 火力全开中都讲过
返回结果:

【2】左外挖空EXCEPT

上图左表是Sheet1,右表是我新建的日期表,我想从日期表中将Sheet1表中有的日期抠出去,应该用EXCEPT函数。详见《DAX神功》第3卷第8回

返回结果:

【3】将左外挖空的结果与Sheet1表合并到一起
但是,因为左外挖空的结果只有一列,UNION合并要求是列数相同,所以我们要给左外挖空添加一个空列,就可以合并了。
返回结果:

返回结果:

【4】利用RankX函数给上表加索引
返回结果:

【5】给上表添加一个判断列,销量不为空就返回1,否则返回Blank()
那空的就是咱们补进来占位的日期
返回结果:

【6】最重要的一步分析(这一步我们用简单的数据测试)
这一段你要非常认真的去测试,除非你对计算过程了如指掌。

我们想计算数值列的最大连续次数,那肯定是:2
这里还是利用我们M函数Table.Group第4参数的逻辑,想办法实现下表的样子:
然后再统计ABCDE谁的行数最多,是多少行!

我们回忆《DAX神功》第2卷第2回的知识来处理今天的问题
A:每行都返回:1+1+1=3
B:每行都返回:1+1+1+1+1+1=6 (因为有6行,每行返回1*6)

每行都锁定小于等于当前行的索引所产生的表,用产生的这张表的总行数 减去 这张表的数值之和,计算顺序见下图:

返回结果:

接下来我们对判断列聚合计数:
《DAX神功》第4卷第21回讲的使用summarize分组聚合
先用Summarize分组,
返回结果:

用这张表的当前行的值,在表1中计算对应的行数。
// 这里要注意,Addcolumns派生列没有筛选功能,但是这里我们每行对应一张表,是通过FILTER('表1',[分组值]=x)筛选出来,使用COUNTROWS计数的,不存在筛选的问题。
返回结果:

然后我们去计算【次数】列最大值-1就可以了。
切记一定用最简单的数据测试!!!用最简单的数据测试!!!用最简单的数据测试!!!我特别不理解,你在学习中为什么要使用几十行以上的数据呢?又不是研究优化,你用那么多行的数据怎么能做到一眼看出正确答案呢?
【7】直接写我们计算最大连续日期的度量值
刚才第5步,我们已经算到tb5了,第6步我们通过简单案例搞定了后面的内容,现在直接写出度量值吧。
友情提示:if([索引]<=x,1-[判断]) 也可以写成 ([索引]<=x)*(1-[判断]),因为if(True,执行内容,BLANK()),True就是1,只要满足([索引]<=x)条件就返回1;如果不满足条件,就是否则0乘以任何数等于0就是BLANK()。这个简写我们在Python和VBA中都给大家介绍过。
返回结果:

二、非数值/日期类型的连续次数计算

【1】利用PowerQuery增加索引列
很遗憾的告诉大家,我就是大神口中那个没入门DAX的人;这张表让我加索引,我用DAX搞不定,因为我没入门呀:)现在时间是:公元2021年12月31日,不知道以后的DAX中会不会有增加索引的函数。

相同的值返回相同的序号这个我们都会!但是如上图所示,原表就一列,就是将原表变成右边的表,用DAX我不会。如果哪位大神知道欢迎指教。大神们经常是有所保留,像这种简单的问题,他们从来不帮助我,总是私信我说哪里哪里你说的不对,我说对的是什么?
大神说:内层、外层、隐形、显形、循环依赖、沿袭..........一句自己的理解都不说,完全背书式的给我堆名词
我说:停停停。。。你这是《DAX权威指南》上面的原话,重复它干什么嘛?

我们通过上图回到PowerQuery或者在导入时点击编辑进入PowerQuery

【添加列】~【索引列】~【从1】


【主页】~【关闭并应用】~【关闭并应用】 就回来了!

【2】给Sheet2新建列,让他显示下一个姓名
《DAX神功》第1卷第14回 中的原例,知道为什么要在DAX神功在这一回,重点重复《火力全开》中的这个案例吗?因为《DAX神功》主线剧情最终回(第4卷第22回)要用到。
返回结果:

【3】如果【姓名】=【下一个姓名】就返回1
意思就是下一行还是这个名子就是连续呗
【4】求分组值
公式我们在上一个案例上详细展开讲解了,不再重复
返回结果:

【5】分组聚合
上一个案例详细讲过了,这里不再重复
返回结果:去计算【次数】列最大值就可以了。

【6】我们将上面的步骤写成度量值
返回结果:

友情提示:如果你是复制我的代码,发现下面的问题,不要惊慌,鼠标点一下公式任何位置都可以,再回车一下就好了。

《DAX神功》主线剧情到此结束,全4卷+答网友问共106集
我们尽快安排《DAX神功》DLC部分同时会坚持创作《DAX神功番外篇》
四、写在最后感谢一直在帮助我的部分讲师和粉丝
感谢哈罗雷球白夕尚*等诸位前辈,如果不是各位的鼎力帮助和动力支持,《DAX神功》可能永远不会问世,必境这耗费了我5个月的时间,人这一生能有多少5个月?《DAX神功》是我给各位的新年礼物,在2021最后之际,孙兴华祝各位前辈生意兴隆通四海,财源茂盛达三江,四海八荒任你行,我们三生三世做朋友!
尊敬的各位粉丝,在这个世界上,除了我的父母和我大哥以外,你们是我最亲的人,因为有了你们我有了活下去的勇气,每次看到你们点赞、留言、弹幕,我都很欣慰,在我生命接近尾声的时候遇到了你们,或许是命中注定,我要尽可能做更多有意义的事情,帮助更多的人。感谢所有支持我的朋友们,希望你们所有人永远平安、幸福;祝我们伟大的祖国繁荣昌盛。
孙兴华
2021年12月31日

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等