在PowerBI中找出连续销售额大于某个阈值的日期范围

在商业数据分析中,识别连续满足特定条件的时间段是一项常见需求。本篇文章将详细介绍如何在PowerBI中找出连续销售额大于某个阈值的日期范围,这一技巧对于销售趋势分析、异常检测和业务决策都具有重要价值。

问题描述

为了分析客户购买行为,现在需要找出连续销售额大于100的各个日期范围,请自行建模完成计算。具体问题如下图所示:

本案例初始数据只有单个表,其完整数据如下:

销售表:

YearMonthDateSales
2025012025/01/2484
2025012025/01/26120
2025012025/01/28130
2025012025/01/30115
2025012025/01/3168
2025022025/02/01150
2025022025/02/0390
2025022025/02/04140
2025022025/02/08120
2025022025/02/09130
2025022025/02/1080
2025022025/02/11105
2025022025/02/12110

若需其它辅助表等,可自行创建并建模。

解题要点

1、可以先找出满足条件的日期,然后再进行分组取最小日期和最大日期并拼接文本返回。

2、由于日期并不是严格连续,因此比较简单的方式就是使用窗口函数,比如使用OFFSET函数来获取上一个日期与下一个日期所对应的销售额,只要其中任意一个超出阈值,并且当前日期的销售额也是超出阈值的,那么当前日期就是连续日期中的一个。

3、最后进行分组并拼接文本返回即可,分组的方法或逻辑可参考下图:

解决方案

首先,数据模型如下图所示:

然后,创建如下度量值:

连续销售大于100的日期范围 = 
VAR N = 100
VAR AddTag = 
    ADDCOLUMNS(
        '销售表',
        "IsSatisfied",
            VAR CurVal = '销售表'[Sales]
            VAR PreVal = MAXX(OFFSET(-1,DISTINCT('销售表'),ORDERBY('销售表'[Date])),'销售表'[Sales])
            VAR NextVal = MAXX(OFFSET(1,DISTINCT('销售表'),ORDERBY('销售表'[Date])),'销售表'[Sales])
            RETURN
            IF(CurVal>N && (PreVal>N || NextVal>N),0,1)
    )
VAR Grp = ADDCOLUMNS(AddTag,"Grp",SUMX(FILTER(AddTag,'销售表'[Date]<=EARLIER('销售表'[Date])),[IsSatisfied]))
RETURN
CONCATENATEX(
    FILTER(
        SUMMARIZE(Grp,[IsSatisfied],[Grp],"Period",FORMAT(MIN('销售表'[Date]),"yyyy/mm/dd")&" - "&FORMAT(MAX('销售表'[Date]),"yyyy/mm/dd")),
        [IsSatisfied]=0
    ),
    [Period],
    UNICHAR(10)
)

最后创建一个矩阵,并将月份字段作为行标签,再将上面的度量值放入值字段即可,如下图所示:

虽然上面这个度量值的结果并没有问题,但其中的AddTag变量的步骤其实是多余的。因为本案例要计算的是时间段的起始日期与结束日期的文本拼接,因此其实并不需要判断每个日期是否属于连续超阈值日期,可以直接进行分组的。

改进后的度量值如下:

连续销售大于100的日期范围 = 
VAR N = 100
VAR TempTbl = ADDCOLUMNS(VALUES('销售表'[Date]),"Sales",CALCULATE(SUM('销售表'[Sales])))
VAR Grp = ADDCOLUMNS(TempTbl,"Grp",IF([Sales]>N,COUNTROWS(FILTER(TempTbl,[Sales]<=N && '销售表'[Date]<EARLIER('销售表'[Date])))))
RETURN
CONCATENATEX(
    FILTER(
        SUMMARIZE(
            Grp,[Grp],
            "Period",FORMAT(MIN('销售表'[Date]),"yyyy/mm/dd")&" - "&FORMAT(MAX('销售表'[Date]),"yyyy/mm/dd"),
            "Num",COUNT('销售表'[Date])
        ),
        [Num]>1 && [Grp]<>BLANK()
    ),
    [Period],
    UNICHAR(10)
)

结果如下图:

此外,为方便用户查看,也可以使用折线图等视觉对象进行可视化,如下图所示:

折线图中使用到的度量值如下:

连续超阈值范围 = 
VAR N = 100
VAR CurVal = SUM('销售表'[Sales])
VAR PreVal = CALCULATE(SUM('销售表'[Date]),OFFSET(-1,ORDERBY('销售表'[Date])))
VAR NextVal = CALCULATE(SUM('销售表'[Date]),OFFSET(1,ORDERBY('销售表'[Date])))
RETURN
IF(CurVal>N && (PreVal>N || NextVal>N),CurVal)

其他方案

以下解决方案精选自技术交流群中的其他小伙伴,希望他们的独到见解和解决思路能够为大家提供更多启发,内容已征得同意,特此分享出来供大家参考和借鉴。

1、一棵松:

2、XSY:

总结

以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!

PBI/DAX技术交流群(QQ):344353627

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值