Power Query(M语言),向上统计出现次数和获取上次数据的问题
我现在有一个表,有两列基础数据,分别是【工单号】、【创建时间】。我通过List.Count+List.Select统计出了每个账号一共多少张单。
现在代码是这样的:
let
源 = #table({"工单号","创建时间"},{{"A14981",#datetime(2022,7,18,1,16,38)},{"A23369",#datetime(2022,7,18,4,22,36)},{"A66258",#datetime(2022,7,18,7,27,55)},{"A38457",#datetime(2022,7,18,7,35,11)},{"A43493",#datetime(2022,7,18,7,48,42)},{"A72556",#datetime(2022,7,18,8,3,15)},{"A73891",#datetime(2022,7,18,8,9,42)},{"A67268",#datetime(2022,7,18,8,10,20)},{"A23369",#datetime(2022,7,18,8,18,0)},{"A57730",#datetime(2022,7,18,8,19,22)},{"A80632",#datetime(2022,7,18,8,24,11)},{"A23369",#datetime(2022,7,18,8,32,27)},{"A85477",#datetime(2022,7,18,8,42,57)},{"A66258",#datetime(2022,7,18,8,54,37)},{"A74534",#datetime(2022,7,18,8,54,44)},{"A10964",#datetime(2022,7,18,9,0,37)},{"A69654",#datetime(2022,7,18,9,3,20)},{"A76752",#datetime(2022,7,18,9,3,36)},{"A33742",#datetime(2022,7,18,9,3,37)},{"A16170",#datetime(2022,7,18,9,3,54)},{"A76123",#datetime(2022,7,18,9,8,39)},{"A31725",#datetime(2022,7,18,9,10,3)},{"A18579",#datetime(2022,7,18,9,15,46)},{"A84359",#datetime(2022,7,18,9,15,47)},{"A39633",#datetime(2022,7,18,9,17,4)},{"A87179",#datetime(2022,7,18,9,17,33)},{"A58260",#datetime(2022,7,18,9,17,40)},{"A11409",#datetime(2022,7,18,9,17,47)},{"A54634",#datetime(2022,7,18,9,22,7)},{"A82306",#datetime(2022,7,18,9,22,11)}}),
#"添加列【累计工单数】" = Table.AddColumn(源,"累计工单数",each List.Count(List.Select(源[工单号],(x)=>x=[工单号])))
in
#"添加列【累计工单数】"
但我希望再创建2列,分别是:
【工单次数】 = 本账号到本行出现了多少次。
【上次创建时间】 = 本账号上次的建单时间。
我的思路是要先获得本行行号,再用List.Range向上选择再统计。
但我不知道这个思路对不对,也不知道如何获得本行行号。
请教各位大佬,以上2列如何能实现,感谢指教。 深奥,不会 感觉很负责的样子 我可能没太看懂你的需求,尝试写了一下定位行号,以为工单号是无重复的,但实际看了一下是有重复的,就暂且看看能不能帮上你 用透视表功能啊 自己研究了一下,已经实现功能。
解决思路是先创建一个索引列;
本账号总数 = 通过账号进行List.Select筛选;
本账号累计数 = 通过本行索引,定位List.PositionOf索引出现位置,得出该账号到本行有多少张单;
上次创建时间 = 通过本行索引-2,从SelectRows提取上一行创建时间。
具体代码如下,还有各位大佬提出优化意见。
如果有更优写法,非常重要,因为实际操作时数据庞大,代码决定执行耗时。感谢。
let
源 = #table({"工单号","创建时间"},{{"A14981",#datetime(2022,7,18,1,16,38)},{"A23369",#datetime(2022,7,18,4,22,36)},{"A66258",#datetime(2022,7,18,7,27,55)},{"A38457",#datetime(2022,7,18,7,35,11)},{"A43493",#datetime(2022,7,18,7,48,42)},{"A72556",#datetime(2022,7,18,8,3,15)},{"A73891",#datetime(2022,7,18,8,9,42)},{"A67268",#datetime(2022,7,18,8,10,20)},{"A23369",#datetime(2022,7,18,8,18,0)},{"A57730",#datetime(2022,7,18,8,19,22)},{"A80632",#datetime(2022,7,18,8,24,11)},{"A23369",#datetime(2022,7,18,8,32,27)},{"A85477",#datetime(2022,7,18,8,42,57)},{"A66258",#datetime(2022,7,18,8,54,37)},{"A74534",#datetime(2022,7,18,8,54,44)},{"A10964",#datetime(2022,7,18,9,0,37)},{"A69654",#datetime(2022,7,18,9,3,20)},{"A76752",#datetime(2022,7,18,9,3,36)},{"A33742",#datetime(2022,7,18,9,3,37)},{"A16170",#datetime(2022,7,18,9,3,54)},{"A76123",#datetime(2022,7,18,9,8,39)},{"A31725",#datetime(2022,7,18,9,10,3)},{"A18579",#datetime(2022,7,18,9,15,46)},{"A84359",#datetime(2022,7,18,9,15,47)},{"A39633",#datetime(2022,7,18,9,17,4)},{"A87179",#datetime(2022,7,18,9,17,33)},{"A58260",#datetime(2022,7,18,9,17,40)},{"A11409",#datetime(2022,7,18,9,17,47)},{"A54634",#datetime(2022,7,18,9,22,7)},{"A82306",#datetime(2022,7,18,9,22,11)}}),
添加列索引 = Table.AddIndexColumn(源, "索引", 1, 1, Int64.Type),
重排序列 = Table.ReorderColumns(添加列索引,{"索引", "工单号", "创建时间"}),
添加列本账号总数 = Table.AddColumn(重排序列,"本账号总数",each List.Count(List.Select(重排序列[工单号],(x)=>x=[工单号]))),
添加列本账号累计数 = Table.AddColumn(添加列本账号总数,"本账号累计数",each List.PositionOf(Table.SelectRows(添加列本账号总数,(x)=>x[工单号]=[工单号])[索引],[索引])+1),
添加列上次创建时间 = Table.AddColumn(添加列本账号累计数,"上次创建时间",each if [本账号累计数] <=1 then "" else Table.SelectRows(添加列本账号累计数,(x)=>x[工单号]=[工单号])[创建时间]{[本账号累计数]-2})
in
添加列上次创建时间 多用分组、合并,少用筛选、定位。
实测1万行用时约2秒:
let
源 = Excel.CurrentWorkbook(){},
索引 = Table.AddIndexColumn(源, "索引", 1, 1, Int64.Type),
分组 = Table.Group(索引, {"工单号"}, {{"a",each Table.AddIndexColumn(Table.AddIndexColumn(_,"累计数",1),"辅助", 0)},{"总次数",each Table.RowCount(_)}}),
展开1 = Table.ExpandTableColumn(分组, "a", {"创建时间", "索引", "累计数","辅助"}),
合并 = Table.NestedJoin(展开1, {"工单号", "辅助"}, 展开1, {"工单号", "累计数"}, "展开", JoinKind.LeftOuter),
展开2 = Table.ExpandTableColumn(合并, "展开", {"创建时间"}, {"展开.创建时间"}),
排序 = Table.Sort(展开2,{{"索引", Order.Ascending}})
in
排序
页:
[1]