如何在Power Query (M)中计算客户无销售的平均天数?
计算客户无销售的平均天数(Power Query实现)
测试数据准备
先模拟你提到的4行测试数据(2个客户各2条销售记录),方便验证逻辑:
| Nombre | Fecha |
|---|---|
| 客户A | 2024-01-01 09:00:00 |
| 客户A | 2024-01-03 14:00:00 |
| 客户B | 2024-01-02 10:00:00 |
| 客户B | 2024-01-05 11:00:00 |
完整Power Query代码
基于你已经写的初始步骤,我把后续逻辑补全了,代码里加了详细注释,替换掉模拟的测试数据部分就能直接用:
// 先模拟测试数据(实际使用时替换成你的Tabla1) let // 模拟4行测试数据:2个客户各2条销售记录 测试数据 = Table.FromRecords({ [Nombre = "客户A", Fecha = #datetime(2024,1,1,9,0,0)], [Nombre = "客户A", Fecha = #datetime(2024,1,3,14,0,0)], [Nombre = "客户B", Fecha = #datetime(2024,1,2,10,0,0)], [Nombre = "客户B", Fecha = #datetime(2024,1,5,11,0,0)] }), // 你的初始步骤:替换成实际的Excel表加载 // Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content], Origen = 测试数据, #"Tipo cambiado" = Table.TransformColumnTypes(Origen,{{"Nombre", type text}, {"Fecha", type datetime}}), #"Fecha extraída" = Table.TransformColumns(#"Tipo cambiado",{{"Fecha", DateTime.Date, type date}}), // 步骤1:按客户分组,收集每个客户的所有销售日期 #"按客户分组" = Table.Group(#"Fecha extraída", {"Nombre"}, {{"销售日期列表", each [Fecha], type list}}), // 步骤2:对每个客户的日期列表排序(确保时间顺序正确,避免原始数据乱序) #"日期排序" = Table.TransformColumns(#"按客户分组", {{"销售日期列表", List.Sort, type list}}), // 步骤3:计算相邻销售日期之间的无销售天数 #"计算无销售天数" = Table.AddColumn(#"日期排序", "无销售天数列表", each let 日期列表 = [销售日期列表], // 生成相邻日期的配对(比如[1号,3号]会变成{(1号,3号)}) 相邻日期对 = List.Pairs(日期列表), // 计算每对日期的间隔天数,减1就是中间无销售的天数(比如1号到3号间隔2天,无销售天数是1天) 无销售天数 = List.Transform(相邻日期对, each Duration.Days(_[2] - _[1]) - 1) in 无销售天数 ), // 步骤4:计算无销售天数的平均值(如果客户只有1条销售记录,返回0) #"计算平均无销售天数" = Table.AddColumn(#"计算无销售天数", "平均无销售天数", each let 天数列表 = [无销售天数列表], 平均值 = if List.IsEmpty(天数列表) then 0 else List.Average(天数列表) in 平均值 ), // 整理最终结果,只保留需要的列 #"整理最终列" = Table.SelectColumns(#"计算平均无销售天数", {"Nombre", "平均无销售天数"}) in #"整理最终列"
验证结果
运行上面的代码后,会得到以下结果:
| Nombre | 平均无销售天数 |
|---|---|
| 客户A | 1 |
| 客户B | 2 |
完全符合预期:
- 客户A的销售日期是1号和3号,中间无销售的是2号(1天),平均值就是1
- 客户B的销售日期是2号和5号,中间无销售的是3号、4号(2天),平均值就是2
如果实际数据中客户有更多销售记录(比如3条及以上),代码会自动计算所有相邻间隔的无销售天数,再取平均值,完全适配你的需求。
内容的提问来源于stack exchange,提问作者KronosL
相关产品推荐
相关产品推荐

