问题呈现
有学员问了这么一个问题:
请教一下,我想想设置两个度量值,一个开始时间,一个结束时间,用来反应每个产品是几点开始生产,几点结束的,这个要怎么设置呢?
单纯的用min和max不行,应为有的产品一天之中可能有两个生产时段,中间穿插生产了别的产品。如果某一产品一天之内的生产时段不唯一,这个开始时间和结束时间的度量值,把多个时间点用逗号隔开
比如2024-12-18这一天,MG9325这个产品有两个时间段在生产,就要将这两个时间段都标注出来:
思路分析
首先学员自己就分析出来了,直接用max和min是不行的,因为会有部分日期的部分商品一天有多个时间段。
那怎么分别找出多个时间段的起始时间和结束时间呢?
以起始时间为例,我们可以添加一列,对于每一行,添加它的上一行的产品ID,如果这一行和上一行的产品ID不同,那么就表示这个产品的当日开始生产时间,并且按照每天进行分割。
解决方案
为方便获取上一行,我们先按照日期和时间顺序添加一列索引:
然后添加“产品2”字段,注意使用了 ALLEXCEPT 函数来分割每一天:
产品2 =
var a=CALCULATE(SELECTEDVALUE('生产批次时间'[索引]))
var b=a-1
var c=CALCULATE(MAX('生产批次时间'[产品]),'生产批次时间'[索引]=b,ALLEXCEPT('生产批次时间','生产批次时间'[日期]))
return c
结果:
从表中可以看到,每天的第一个时间总是空白,此时,我们只要加上一个判断:
start = IF([产品2]<>[产品],[time1])
就可以得到每个产品在每天发生变化的时间,也就是从A产品变化到B产品的时间点,并且加上了每天的起始时间,就得到了每天不同产品的开始加工时间。
按照类似的逻辑也可以得到结束时间:
对于每一天每一个产品而言,使用CONCATENATEX函数将这些起止时间连起来就可以了:
开始时间 = CONCATENATEX(CALCULATETABLE('生产批次时间','生产批次时间'[start]>0),[start],",")
结束时间 = CONCATENATEX(CALCULATETABLE('生产批次时间','生产批次时间'[end]>0),[end],",")
结果呈现:
结论
这个问题是一个常见的业务分析场景,也有多种解决方案,可以直接在powerquery中处理,也可以通过直接书写dax度量值来实现,本方案是采用了新建列的方式,大家可以想想如何使用其他的方法来实现。
本问题的提问者比较清晰地阐述了问题,给出了原始数据,并提供了一个想要的结果示例,是一个合格的提问。
原始数据和示例文件已存入“学谦PowerBI”知识星球,加入“学谦PowerBI”知识星球,享有全年365天不限次技术问答,并赠送永久PowerBI Pro账号一个。
扫码添加微信,暗号:BI星球