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) |
|---|---|---|---|---|
| 73754 | 15/06/2022 09:00:36 | 25441919 | 0 | 73754 |
| 75614 | 15/06/2022 11:16:00 | 40549143 | 36 | 75614 |
| 75790 | 15/06/2022 11:22:15 | 40549143 | 107 | 75614 |
| 75805 | 15/06/2022 11:50:23 | 40549143 | 95 | 75614 |
| 75931 | 15/06/2022 13:25:50 | 55559355 | 247 | 75931 |
| 76280 | 15/06/2022 14:53:25 | 52409455 | 2 | 76387 |
| 76387 | 15/06/2022 15:10:12 | 52409455 | 37 | 76387 |
| 76555 | 16/06/2022 10:15:13 | 52409455 | 33 | 76555 |
解决方案
你的代码问题出在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
相关产品推荐
相关产品推荐

