Excel 找出日期上的差距

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

我有一张有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/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)