ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 551|回复: 5

[求助] Power Query,向上统计出现次数和获取上次数据的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-8-18 11:03 | 显示全部楼层 |阅读模式
我现在有一个表,有两列基础数据,分别是【工单号】、【创建时间】。
我通过List.Count+List.Select统计出了每个账号一共多少张单。
微信图片_20220818110140.png


现在的代码如下:


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列如何能实现,感谢指教。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-18 13:20 | 显示全部楼层
自己研究了一下,已经实现功能。
解决思路是先创建一个索引列;
本账号总数 = 通过账号进行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
    添加列上次创建时间

TA的精华主题

TA的得分主题

发表于 2022-8-18 14:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不知道是不是这个意思。

工作簿1.rar

15.82 KB, 下载次数: 8

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-18 15:53 | 显示全部楼层
zhong1218 发表于 2022-8-18 14:59
不知道是不是这个意思。

就是这个意思,感谢大佬提供另一个解决思路。

TA的精华主题

TA的得分主题

发表于 2022-8-18 16:46 | 显示全部楼层
cqwcns 发表于 2022-8-18 13:20
自己研究了一下,已经实现功能。
解决思路是先创建一个索引列;
本账号总数 = 通过账号进行List.Select筛 ...

用索引直接替代List.PositionOf就可以用了,

  1. let
  2.     #"Added Grouped" = Table.Group(#"SYSLOG", "工单号", {"Grouped", each let indexed = Table.AddIndexColumn(_, "Cnt", 1) in Table.AddColumn(indexed, "Latest", each try indexed[创建时间]{[Cnt]-2} otherwise null)}),
  3.     #"Expanded Grouped" = Table.ExpandTableColumn(#"Added Grouped", "Grouped", {"创建时间", "Cnt", "Latest"}, {"创建时间", "Cnt", "Latest"}),
  4.     #"Sorted Rows" = Table.Sort(#"Expanded Grouped",{{"创建时间", Order.Ascending}})
  5. in
  6.     #"Sorted Rows"
复制代码
image.png

对于这类排序统计,PQ不是不能做;但是数据一多,执行效率上是不如DAX的。用专业的工具做专业的事。
image.png

SYSLOG.zip

20.37 KB, 下载次数: 2

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-8-23 01:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
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=[工单号]))),
    #"添加列【工单次数】" = Table.AddColumn(#"添加列【累计工单数】","工单次数",each Table.RowCount(Table.SelectRows(源,(x)=>x[工单号]=[工单号] and x[创建时间]<=[创建时间]))),
    #"添加列【上次创建时间】" = Table.AddColumn(#"添加列【工单次数】","上次创建时间",each try Table.Last(Table.SelectRows(源,(x)=>x[工单号]=[工单号] and x[创建时间]<[创建时间]))[创建时间] otherwise "第一次创建")
in
    #"添加列【上次创建时间】"
image.jpg

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-7 19:06 , Processed in 0.039148 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表