You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power Query中如何添加列,取客户当日首条长时通话ID

问题描述

我有一张通话记录表,部分日期存在同一客户的多条通话记录。希望新增EventoID列,使同一客户当日的所有通话均显示该客户当日第一条时长≥15秒的通话的Call_ID。当前上一步骤名为“Máximo insertado”,尝试的代码如下:

= Table.AddColumn(#"Máximo insertado", "EventoID", each List.Min(List.Select(#"Máximo insertado"[Call_ID], each #"Máximo insertado"[Cliente] = [Cliente] and Number.RoundDown(#"Máximo insertado"[Date],0) = Number.RoundDown([Date],0) and #"Máximo insertado"[Duration] >= 15)))

我认为自己未正确使用List.Select,但未能找到有帮助的示例。

补充表格示例(最后一列为期望结果):

通话ID(Call_ID)日期(Date)客户(Cliente)时长(Duration)事件ID(EventoID)
7375415/06/2022 09:00:3625441919073754
7561415/06/2022 11:16:00405491433675614
7579015/06/2022 11:22:154054914310775614
7580515/06/2022 11:50:23405491439575614
7593115/06/2022 13:25:505555935524775931
7628015/06/2022 14:53:2552409455276387
7638715/06/2022 15:10:12524094553776387
7655516/06/2022 10:15:13524094553376555
解决方案

你的代码问题出在List.Select的迭代逻辑里——直接引用整个表的列(#"Máximo insertado"[Cliente]),而非迭代时的当前行数据。正确思路是先按客户+日期分组,在每组内筛选出符合条件的记录并取最早的Call_ID,再合并回原表。

完整可执行代码

直接替换你原有的AddColumn步骤即可:

let
    #"添加日期分组列" = Table.AddColumn(#"Máximo insertado", "Fecha_Solo", each Number.RoundDown([Date], 0)),
    #"分组获取EventoID" = Table.Group(#"添加日期分组列", {"Cliente", "Fecha_Solo"}, {
        {"EventoID", each 
            let
                // 筛选当前组内时长≥15秒的记录
                Filtrado = Table.SelectRows(_, each [Duration] >=15),
                // 判断是否有符合条件的记录,取对应Call_ID
                Resultado = if Table.RowCount(Filtrado) > 0 then
                    // 按通话时间排序,取最早的那条Call_ID
                    Table.First(Table.Sort(Filtrado,{{"Date", Order.Ascending}}))[Call_ID]
                else
                    // 无符合条件的记录时,取组内第一条通话的Call_ID
                    Table.First(_)[Call_ID]
            in Resultado
        }
    }),
    #"合并回原表" = Table.NestedJoin(#"添加日期分组列", {"Cliente", "Fecha_Solo"}, #"分组获取EventoID", {"Cliente", "Fecha_Solo"}, "分组数据", JoinKind.LeftOuter),
    #"提取EventoID列" = Table.AddColumn(#"合并回原表", "EventoID", each [分组数据][EventoID]{0}),
    #"清理冗余列" = Table.RemoveColumns(#"提取EventoID列", {"Fecha_Solo", "分组数据"})
in
    #"清理冗余列"

原代码错误原因

原代码中List.Select的迭代逻辑里,你用整个表的Cliente列和当前行[Cliente]对比,会把全表中所有客户ID匹配的记录都筛选出来,而非同一客户+同一日期的组内记录。分组的方式逻辑更清晰,运行效率也更高。

内容的提问来源于stack exchange,提问作者Melvin Orellana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:50:39