如何根据相同条件的前一个日期计算日期

问题描述 投票:0回答:1

为了清晰起见进行了编辑。

我有一个不同客户的数据集,这些客户在不同的时间间隔内有不同的文档。

我想使用 PowerQuery 根据同一客户的同一文档的上一个日期来计算文档的下一个到期日。

在原始表中,称为“Raw_Data_Table”。它有三列。其中之一是客户姓名,第二个是不同的文件,第三个是文件完成的时间。

姓名 记录类型 完成日期
客户1 就业 01/01/24
客户1 就业 06/12/23
客户1 就业 12/14/22
客户1 功能性 11/12/24
客户1 功能性 05/12/24
客户1 尼古丁 12/14/22
客户2 就业 06/14/22
客户2 就业 12/14/23
客户2 功能性 09/16/24
客户2 功能性 03/14/24
客户2 功能性 09/10/23
客户2 尼古丁 07/29/24
客户2 尼古丁 07/23/23

原始数据表

我希望能够根据同一文档的前一个日期确定文档的到期日。例如,于 2024 年 1 月 1 日完成的客户 1 就业评估的截止日期为 2023 年 1 月 12 日。如果我比较两个日期,我就会知道它是按时完成的,所以这个文件实际上完成得很晚。

以一种非常粗略的方式,我可以通过在 D2 中使用这个公式来实现:

=IF(AND(A2=A3,B2=B3,B2="Employment Assessment"),EOMONTH(C3+180,-1)+1,
IF(AND(A2=A3,B2=B3,B2="Functional Assessment"),EOMONTH(C3+180,-1)+1,
IF(AND(A2=A3,B2=B3,B2="Nicotine Assessment"),EOMONTH(C3+365,-1)+1,
"")))

这并不理想,因为如果表的排序方式不同,则很容易出错。我想通过一个查询来完成此操作,该查询仅通过查找为客户创建文档类型的上一个日期并根据该上一个日期计算截止日期来创建“截止日期”列。

这就是我希望结果出现的方式。

文档_with_Due_Dates

powerquery
1个回答
0
投票

您可以使用

Table.Group
函数来执行此操作。
Name
Record Type
进行分组,然后创建自定义聚合。

我通过对每个子表中的日期列进行排序来确保正确的顺序。如果日期始终按降序排列,则可以省略此步骤。

如果您的原始数据采用某种排序顺序,您希望保留最终输出,请在 Table.Group 函数之前添加一个 Index 列,并使用它来恢复原始顺序。

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Record Type", type text}, {"Done Date", type date}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name", "Record Type"}, {
        {"Due Date", (t)=>
            let 
                sort = Table.Sort(t,{"Done Date", Order.Descending}),
                #"Added Index"=Table.AddIndexColumn(sort,"Index",0,1,Int64.Type),
                #"Added Due Date" = Table.AddColumn(#"Added Index","Due Date",
                        each try Date.AddMonths(Date.StartOfMonth(#"Added Index"{[Index]+1}[Done Date]),if [Record Type]="Nicotine" then 12 else 6) otherwise null,type date)
                
            in 
                #"Added Due Date", type table[Name=text, Record Type=text, Done Date=date, Due Date=date]
            }}),
    #"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Name", "Record Type"}),
    #"Expanded Due Date" = Table.ExpandTableColumn(#"Removed Columns", "Due Date", {"Name", "Record Type", "Done Date", "Due Date"})
in
    #"Expanded Due Date"

enter image description here

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