ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] PowerQuery,按时间获得上一条记录的问题。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-9 15:31 | 显示全部楼层 |阅读模式
PowerQuery,以下代码,用来获得工单的上一次创建时间。
功能已经实现,但当数据量大时,性能比较差。

  1. let
  2.     获得上次数据 = (curList as list, curValue as datetime)=>
  3.         let
  4.             thisIndex = List.PositionOf(curList, curValue),
  5.             thisValue = if thisIndex > 0 then curList{thisIndex-1} else "第一次创建"
  6.         in
  7.             thisValue,
  8.     源 = #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,16,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)}}),
  9.     分组.工单号分组排序 = Table.Group(源, {"工单号"}, {{"工单号分组排序", each Table.Sort(_, {"创建时间"})[创建时间], type table [工单号=text, 创建时间=datetime]}}),
  10.     添加列.创建时间列表 = Table.AddColumn(源,"创建时间列表",each Table.SelectRows(分组.工单号分组排序,(x)=>x[工单号]=[工单号])[工单号分组排序]{0}),
  11.     添加列.上次创建时间 = Table.AddColumn(添加列.创建时间列表, "上次创建时间", each 获得上次数据([创建时间列表],[创建时间])),
  12.     删除列.创建时间列表 = Table.RemoveColumns(添加列.上次创建时间,{"创建时间列表"})
  13. in
  14.     删除列.创建时间列表
复制代码

所以,如果根据工单号和创建时间,获得其上次创建时间,怎么写更简洁高效?请各位大佬指教,感谢。

TA的精华主题

TA的得分主题

发表于 2023-5-9 20:27 | 显示全部楼层
模拟些数据出来,也许有大佬能给你写出简洁高效的代码,你发个这样的东西,看起来都头痛。

TA的精华主题

TA的得分主题

发表于 2023-5-9 21:18 | 显示全部楼层
    分组 = Table.Group(
        源,
        "工单号",
        {"a",each let m=List.Sort([创建时间]) in Table.FromColumns({m,{"第一次创建"}&List.RemoveLastN(m,1)},{"创建时间","上次创建时间"})}
    ),
    展开 = Table.ExpandTableColumn(分组, "a",{"创建时间","上次创建时间"})

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-10 03:54 | 显示全部楼层
把排序后的时间列稍微错一下位就行了

  1. let
  2.     Source = #table(type table [工单号 = text, 创建时间 = datetime],{{"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,16,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)}}),

  3.     Grouped = Table.Group(Source, "工单号", {"Grp", each let dt = Table.Sort(_,{"创建时间", Order.Ascending})[创建时间] in Table.FromColumns({dt, {null} & List.RemoveLastN(dt)})}),
  4.     #"Expanded Grp" = Table.ExpandTableColumn(Grouped, "Grp", {"Column1", "Column2"}, {"创建时间","上次创建_PQ"})
  5. in
  6.     #"Expanded Grp"
复制代码
image.jpg
image.png

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-27 03:59 , Processed in 0.036810 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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