请求构建DAX公式:计算PCgroup平均配送耗时(含多路线与暂停处理)
DAX解决方案与原有问题分析
原有逻辑核心问题
- 维度拆分缺失:仅按
PCgroup全局取最小/最大Delivery Time,未拆分Delivery Tour和Delivery Date维度,导致不同配送路线、不同日期的配送周期被混为一谈,起始/结束时间计算完全偏离实际业务场景。 - 异常间隔未处理:未识别同一配送周期内连续配送时间的超长间隔(>30分钟),无法从总耗时中扣除该部分无效停顿时长,统计结果失真。
分步实现方案
1. 构建每日配送周期计算表
先创建计算表,按PCgroup + Delivery Tour + Delivery Date维度,计算每日配送起止时间及需扣除的超长间隔总和:
Daily_Delivery_Cycles = ADDCOLUMNS( -- 先按目标维度分组 SUMMARIZE( Table_1, Table_1[PCgroup], Table_1[Delivery Tour], Table_1[Delivery Date] ), -- 每日配送起始时间 "Daily_Start_Time", CALCULATE(MIN(Table_1[Delivery Time])), -- 每日配送结束时间 "Daily_End_Time", CALCULATE(MAX(Table_1[Delivery Time])), -- 当日所有超过30分钟的间隔总和 "Total_Long_Intervals", VAR CurrentGroup = [PCgroup] VAR CurrentTour = [Delivery Tour] VAR CurrentDate = [Delivery Date] -- 按时间排序当前周期的所有配送时间点 VAR SortedDeliveryTimes = CALCULATETABLE( SELECTCOLUMNS(Table_1, "Time", Table_1[Delivery Time]), Table_1[PCgroup] = CurrentGroup, Table_1[Delivery Tour] = CurrentTour, Table_1[Delivery Date] = CurrentDate, ORDER BY Table_1[Delivery Time] ASC ) -- 计算连续时间点的间隔,筛选出超过30分钟的部分 VAR IntervalCalculations = ADDCOLUMNS( SortedDeliveryTimes, "Next_Time", LEAD([Time], 1) OVER (ORDER BY [Time]), "Interval_Mins", DATEDIFF([Time], LEAD([Time], 1) OVER (ORDER BY [Time]), MINUTE) ) RETURN SUMX(FILTER(IntervalCalculations, [Interval_Mins] > 30), [Interval_Mins]) )
2. 创建核心度量值
基于上述计算表,实现平均起止时间、基础耗时、扣除后耗时及状态标识:
-- 平均起始时间(所有日期的每日起始时间均值) MinAVGvalue = AVERAGEX( Daily_Delivery_Cycles, Daily_Delivery_Cycles[Daily_Start_Time] ) -- 平均结束时间(所有日期的每日结束时间均值) MaxAVGvalue = AVERAGEX( Daily_Delivery_Cycles, Daily_Delivery_Cycles[Daily_End_Time] ) -- 基础平均耗时(分钟):平均结束时间与平均起始时间的差值 Base_Average_Duration = DATEDIFF([MinAVGvalue], [MaxAVGvalue], MINUTE) -- 扣除超长间隔后的平均耗时(分钟) Adjusted_Average_Duration = VAR TotalDailyDurations = SUMX( Daily_Delivery_Cycles, DATEDIFF(Daily_Delivery_Cycles[Daily_Start_Time], Daily_Delivery_Cycles[Daily_End_Time], MINUTE) ) VAR TotalDeductedIntervals = SUM(Daily_Delivery_Cycles[Total_Long_Intervals]) VAR TotalValidDays = COUNTROWS(Daily_Delivery_Cycles) RETURN DIVIDE(TotalDailyDurations - TotalDeductedIntervals, TotalValidDays) -- 超长间隔扣除标识 Has_Long_Interval_Deduction = IF( SUM(Daily_Delivery_Cycles[Total_Long_Intervals]) > 0, "已扣除超长间隔", "无超长间隔" )
使用说明
- 计算表
Daily_Delivery_Cycles会自动按业务维度分组,每日数据独立计算,避免跨周期混淆。 - 所有度量值支持按
PCgroup和Delivery Tour筛选,直接展示对应维度下的统计结果。
内容的提问来源于stack exchange,提问作者OneTwentyTo
相关产品推荐
相关产品推荐

