Excel 找出日期上的差距
我有一张有50000个工人记录的桌子。我试图确定每个员工的“第一个”开始日期。如果员工已离职至少30天,则应重置第一个日期 如果power query和power pivot有助于解决此问题,我对它们都很满意。我对VBA不是很满意,但也不反对这样的解决方案 资料 预期结果Excel 找出日期上的差距,excel,vba,excel-formula,powerpivot,powerquery,Excel,Vba,Excel Formula,Powerpivot,Powerquery,我有一张有50000个工人记录的桌子。我试图确定每个员工的“第一个”开始日期。如果员工已离职至少30天,则应重置第一个日期 如果power query和power pivot有助于解决此问题,我对它们都很满意。我对VBA不是很满意,但也不反对这样的解决方案 资料 预期结果 Unique ID Expected Date 1 04/23/2018 2 02/10/2014 3 01/01/2013 4 08/31/2017 5 01/02/2017 6 03/03/20
Unique ID Expected Date
1 04/23/2018
2 02/10/2014
3 01/01/2013
4 08/31/2017
5 01/02/2017
6 03/03/2017
7 10/31/2016
8 01/01/2013
9 02/18/2013
10 09/18/2017
11 05/18/2016
12 01/01/2013
13 06/01/2015
14 06/17/2013
15 06/02/2014
16 02/09/2015
17 02/02/2015
首先,创建一个自定义列
Plus30
,以便更容易地查看正在发生的事情
= Date.AddDays([Worker End Date], 30)
现在我们需要一个自定义列,用于检查当前行的Plus30
是否在下一行的工作者开始日期之前出现
= Table.AddColumn(PrevisousStepName, "Custom",
(C) => if List.Min(
Table.SelectRows(#"Changed Type",
each _[Unique ID] = C[Unique ID] and
_[Order ID] > C[Order ID])
[Worker Start Date])
> C[Plus30] then 1 else 0, Int64.Type)
如果该唯一ID没有后续行,则返回错误
;如果下一行的工作人员开始日期
小于该行的加30
,则返回1
,否则返回0
此时,我将错误替换为一个整数(我任意选取-1
),然后过滤掉Custom
列中的所有1
值
过滤完这些数据后,按唯一ID
对表进行分组,并为预期日期
列选择最小的员工开始日期
这是我将数据加载到表中的整个M代码Table1
:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Unique ID", Int64.Type}, {"Order ID", Int64.Type}, {"Worker Start Date", type date}, {"Worker End Date", type date}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Plus30", each Date.AddDays([Worker End Date], 30), type date),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom", (C) => if List.Min(Table.SelectRows(#"Changed Type", each _[Unique ID] = C[Unique ID] and _[Order ID] > C[Order ID])[Worker Start Date]) > C[Plus30] then 1 else 0, Int64.Type),
#"Replaced Errors" = Table.ReplaceErrorValues(#"Added Custom1", {{"Custom", -1}}),
#"Filtered Rows" = Table.SelectRows(#"Replaced Errors", each ([Custom] <> 1)),
#"Grouped Rows" = Table.Group(#"Filtered Rows", {"Unique ID"}, {{"Expected Date", each List.Min([Worker Start Date]), type date}})
in
#"Grouped Rows"
let
Source=Excel.CurrentWorkbook(){[Name=“Table1”]}[Content],
#“已更改类型”=表.TransformColumnTypes(源,{{“唯一ID”、Int64.Type}、{“订单ID”、Int64.Type}、{“工作人员开始日期”、类型日期}、{“工作人员结束日期”、类型日期}),
#“添加的自定义”=Table.AddColumn(#“已更改类型”,“Plus30”,每个日期.AddDays([Worker End Date],30),类型日期),
#“Added Custom1”=Table.AddColumn(#“Added Custom”、“Custom”,(C)=>if List.Min(Table.SelectRows(#“Changed Type”,每个[Unique ID]=C[Unique ID]和[Order ID]>C[Order ID])[Worker Start Date])>C[Plus30],然后是1,其他0,Int64.Type),
#“替换错误”=Table.ReplaceErrorValues(#“Added Custom1”,{{{“Custom”,-1}),
#“筛选行”=表格。选择行(#“替换错误”,每个([Custom]1)),
#“分组行”=表.Group(#“筛选行”,{“唯一ID”},{{“预期日期”,每个列表.Min([Worker Start Date]),键入日期})
在里面
#“分组行”
请注意,您可以跳过添加Plus30
列,只需将该位包含在Custom
列中。为此,请将公式中的C[Plus30]
替换为Date.AddDays(C[Worker End Date],30)
。您的解释对我来说有点不清楚,但我想您的意思是您想要最后一个开始日期,不包括随后缺勤30天或以上的时段?并且唯一ID
是员工吗
如果是这样,我将使用简单的工作表公式和自动筛选,首先添加一列公式,计算“此结束”和“下一开始”之间的天数,如下所示:
…在本例中,E2
中的公式为:
=IF(A3<>A2,"",C3-D2)
=IF(A3A2,”,C3-D2)
然后自动筛选或删除列E
中的数字大于30的任何行
这将产生如下结果:
请注意,您的数据中的ID#10
有重叠。到目前为止您研究/尝试了什么,您需要帮助的具体问题/错误是什么?这些记录都是一名员工吗?谢谢,我在实际数据中尝试了这一点,power query只是在后台运行,并且被锁定。我还没有收到错误,但它也没有运行。我稍后会更新
=IF(A3<>A2,"",C3-D2)