确定日期的差距

问题描述 投票:-1回答:2

我有50000条记录工人的表。我试图找出每个工人的“第一”的开始日期。如果工人已经被关闭分配至少30天的第一次约会应该复位。

我很舒服功率查询和电力枢纽如果任何有助于解决这个问题。我不是很舒服,但VBA我不是反对解决这样这一点无论。

数据

Unique ID   Order ID    Worker Start Date   Worker End Date
1   1   02/01/2016  03/23/2018
1   2   04/23/2018  04/25/2018
2   3   02/10/2014  05/15/2015
3   4   01/01/2013  05/02/2014
4   5   01/01/2013  05/01/2015
4   6   06/01/2015  10/28/2016
4   7   10/31/2016  07/31/2017
4   8   08/31/2017  04/22/2018
5   9   01/02/2017  05/05/2017
6   10  01/01/2013  12/31/2014
6   11  02/02/2015  01/31/2017
6   12  03/03/2017  04/22/2018
7   13  09/29/2014  09/29/2016
7   14  10/31/2016  03/02/2018
8   15  01/01/2013  05/04/2014
9   16  02/18/2013  05/20/2014
10  17  01/01/2015  03/31/2016
10  18  03/28/2016  03/03/2017
10  19  09/18/2017  09/18/2017
11  20  11/30/2015  02/12/2016
11  21  05/18/2016  07/29/2016
12  22  01/01/2013  11/14/2014
13  23  06/01/2015  08/27/2017
14  24  06/17/2013  02/08/2015
15  25  06/02/2014  11/30/2014
16  26  02/09/2015  06/12/2015
17  27  01/01/2013  12/23/2014
17  28  02/02/2015  12/22/2016
17  29  12/23/2016  12/21/2017

预期成绩

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
excel vba excel-formula powerpivot powerquery
2个回答
3
投票

首先,创建一个自定义的列Plus30,使其更容易地看到发生了什么。

= Date.AddDays([Worker End Date], 30)

现在,我们想,如果下一行的Plus30之前发生的当前行的Worker Start Date,检查自定义列。

= 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)

如果该Error没有后续列。这将返回一个Unique ID,返回1如果下一行的Worker Start Date低于该行的Plus30,并否则返回0

在这一点上,我取代的误差与的整数(I任意拾取-1),然后过滤出所有的1值在Custom柱。

一旦这些信息进行过滤,按Unique ID表,并取最小值超过Worker Start DateExpected Date列。

这里就是我装你的数据插入到表Table1整个M代码:

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"

请注意,您可以跳过添加Plus30列,只是包括在Custom列位。要做到这一点,用公式C[Plus30]更换Date.AddDays(C[Worker End Date], 30)


1
投票

你的解释是有点不清楚我布提想你的意思是你最想要的开始日期,排除其次是没有30天以上是周期?而Unique ID是员工?

如果是的话,我会用简单的工作表公式和自动筛选,开始用一个公式来计算“为此”和“下一个开始”,这样的事情之间的天数增加一列:

img

...在该示例中E2公式为:

=IF(A3<>A2,"",C3-D2)

然后自动筛选或以其它方式删除任何行,其中在柱E的数目大于30。

这将使这样的结果:

img

请注意,对您的数据ID #10重叠。

© www.soinside.com 2019 - 2024. All rights reserved.