Excel按姓名日期匹配上一条记录值,求公式或SQL实现方案
解决方案
Excel 公式实现
前提:表格已按时间升序排列,表头在第1行,数据从第2行开始,列对应关系为:A=Date、B=Time、C=type、D=name、E=prior time、F=prior type。
「Prior Time」列公式(E2单元格)
输入以下公式后下拉填充所有行即可:=IFERROR(LOOKUP(1,0/((A$1:A1=A2)*(D$1:D1=D2)),B$1:B1),"")
公式逻辑:匹配当前行上方所有「同日期、同姓名」的记录,取最近一条的Time值,无匹配项(该用户当日第一条记录)返回空。
「Prior Type」列公式(F2单元格)
输入以下公式后下拉填充所有行即可:
=IFERROR(LOOKUP(1,0/((A$1:A1=A2)*(D$1:D1=D2)),C$1:C1),"")
逻辑和上方一致,仅返回字段改为type列。
如果使用Excel 365/2021及以上版本,也可以用XLOOKUP简化实现,以Prior Time为例:
=IFERROR(XLOOKUP(1,(A$1:A1=A2)*(D$1:D1=D2),B$1:B1,"",0,-1),"")
SQL 实现
假设表名为work_records,字段名和表格列名对应,用窗口函数LAG即可快速实现,SQL语句如下:
SELECT `date`, `time`, `type`, `name`, LAG(`time`) OVER (PARTITION BY `date`, `name` ORDER BY `time`) AS prior_time, LAG(`type`) OVER (PARTITION BY `date`, `name` ORDER BY `time`) AS prior_type FROM work_records ORDER BY `date`, `time`;
逻辑说明:
PARTITION BY按日期、姓名分组,仅对比同组内的记录ORDER BY按时间排序保证取到的是最近的上一条记录- LAG函数默认取当前行的上一行对应字段值,无上行返回NULL,完全匹配需求。
内容的提问来源于stack exchange,提问作者james fay
相关产品推荐
相关产品推荐

