Power Query - 运行 值更改时重置的总数

Power Query - running total that resets when values change

我已经搜索了一个星期,但找不到解决我问题的方法。我有一个 table,其中列出了“事件”,个人在某一周内参加。我想添加一个列 - 通过 PowerQuery - 将计算一个人在该事件中的周数,然后如果事件在下周发生变化则重置。例如...

Pers1 Date Event Weeks in Event
Pers1 12/22/2022 Consideration 1
Pers1 12/26/2022 Consideration 2
Pers1 1/05/2022 Interview 1
Pers1 1/12/2022 Consideration 1
Pers1 1/19/2022 Consideration 2
Pers1 1/26/2022 Awaiting Hire 1
Pers2 1/19/2022 Awaiting Hire 1
Pers2 1/26/2022 Awaiting Hire 2

请注意,当 Pers1 在第 1/12 周和 1/19 周进行第二次考虑时,计数如何重新设置为从 1 开始。此外,我需要解决方案足够智能以区分两个不同的人并唯一地计算他们在事件中的时间。

这个社区对我来说一直很重要。请帮忙!

编辑 1:我合并了 Ron 提供的代码并收到以下错误:Expression.Error:5 个参数被传递给期望在 2 到 4 之间的函数。 细节: 模式= 参数=列表

PQ高级编辑器代码如下:

let
    Source = Excel.Workbook(File.Contents("C:\Location"), null, true),
    Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Pers1", type text}, {"Date", type date}, {"Event", type text}}),

//add an offset column for Pers and Event to do easy comparison with previous row
    offsetPersonEvent=Table.FromColumns(
        Table.ToColumns(#"Changed Type") 
            & {List.RemoveFirstN(#"Changed Type"[Pers1]) & {null}}
            & {List.RemoveFirstN(#"Changed Type"[Event]) & {null}},
            type table[Pers=text, Date=date,Event=text,offsetPers=text, offsetEvent=text] 
    ),

//create "grouper" column by checking where both Pers and Event change
    #"Added Index" = Table.AddIndexColumn(offsetPersonEvent, "Index", 0, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "groups", 
        each if [Pers]=[offsetPers] and [Event]=[offsetEvent] then null else [Index]),

//remove unneeded columns, fillUp the grouper, and group by "grouper"
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"offsetPers", "offsetEvent", "Index"}),
    #"Filled Up" = Table.FillUp(#"Removed Columns",{"groups"}),

//Add Index column to each subtable
    #"Grouped Rows" = Table.Group(#"Filled Up", {"groups"}, {
        {"addedIndex", each Table.AddIndexColumn(_,"Weeks in Event",1,1,Int64.Type)
        , type table}}),

//Remove unneccessary columns
//  Expand the grouped tables
//  reset the data types
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"groups"}),
    #"Expanded addedIndex" = Table.ExpandTableColumn(#"Removed Columns1", "addedIndex", {"Pers", "Date", "Event", "Weeks in Event"}, {"Pers", "Date", "Event", "Weeks in Event"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded addedIndex",{{"Pers", type text}, {"Date", type date}, {"Event", type text}, {"Weeks in Event", Int64.Type}})
    
in
    #"Changed Type1"

假设您的数据按人员排序,然后按日期排序,如您所示,您可以使用以下 M-Code。

(如果您的数据不是这样排序的,那么您可以只添加最初的步骤以对其进行适当排序,然后继续显示的代码)

请阅读代码注释并检查应用步骤以了解算法

打开高级编辑器并粘贴下面的代码

let

//change table name in next line to your actual table name
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Pers1", type text}, {"Date", type date}, {"Event", type text}}),

//add an offset column for Pers and Event to do easy comparison with previous row
    offsetPersonEvent=Table.FromColumns(
        Table.ToColumns(#"Changed Type") 
            & {List.RemoveFirstN(#"Changed Type"[Pers1]) & {null}}
            & {List.RemoveFirstN(#"Changed Type"[Event]) & {null}},
            type table[Pers=text, Date=date,Event=text,offsetPers=text, offsetEvent=text] 
    ),

//create "grouper" column by checking where both Pers and Event change
    #"Added Index" = Table.AddIndexColumn(offsetPersonEvent, "Index", 0, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "groups", 
        each if [Pers]=[offsetPers] and [Event]=[offsetEvent] then null else [Index]),

//remove unneeded columns, fillUp the grouper, and group by "grouper"
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"offsetPers", "offsetEvent", "Index"}),
    #"Filled Up" = Table.FillUp(#"Removed Columns",{"groups"}),

//Add Index column to each subtable
    #"Grouped Rows" = Table.Group(#"Filled Up", {"groups"}, {
        {"addedIndex", each Table.AddIndexColumn(_,"Weeks in Event",1,1,Int64.Type)
        , type table}}),

//Remove unneccessary columns
//  Expand the grouped tables
//  reset the data types
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"groups"}),
    #"Expanded addedIndex" = Table.ExpandTableColumn(#"Removed Columns1", "addedIndex", {"Pers", "Date", "Event", "Weeks in Event"}, {"Pers", "Date", "Event", "Weeks in Event"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded addedIndex",{{"Pers", type text}, {"Date", type date}, {"Event", type text}, {"Weeks in Event", Int64.Type}})
in
    #"Changed Type1"

Ron 的代码只需稍作调整即可运行。对我来说,以下代码部分导致了错误

//Add Index column to each subtable
    #"Grouped Rows" = Table.Group(#"Filled Up", {"groups"}, {
        {"addedIndex", each Table.AddIndexColumn(_,"Weeks in Event",1,1,Int64.Type)
        , type table}}),

我从 Table.AddIndexColumn 中删除了 Int64.Type 参数,一切正常。我在下面包含了更新的代码 snip-it:

let
    Source = Excel.Workbook(File.Contents("C:\Location"), null, true),
    Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Pers1", type text}, {"Date", type date}, {"Event", type text}}),

    //add an offset column for Pers and Event to do easy comparison with previous row
    offsetPersonEvent=Table.FromColumns(
        Table.ToColumns(#"Changed Type") 
            & {List.RemoveFirstN(#"Changed Type"[Pers1]) & {null}}
            & {List.RemoveFirstN(#"Changed Type"[Event]) & {null}},
            type table[Pers=text, Date=date,Event=text,offsetPers=text, offsetEvent=text] 
    ),

    //create "grouper" column by checking where both Pers and Event change
    #"Added Index" = Table.AddIndexColumn(offsetPersonEvent, "Index", 0, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "groups", 
        each if [Pers]=[offsetPers] and [Event]=[offsetEvent] then null else [Index]),

    //remove unneeded columns, fillUp the grouper, and group by "grouper"
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"offsetPers", "offsetEvent", "Index"}),
    #"Filled Up" = Table.FillUp(#"Removed Columns",{"groups"}),

    //Add Index column to each subtable
    #"Grouped Rows" = Table.Group(#"Filled Up", "groups", {
        {"addedIndex", each Table.AddIndexColumn(_,"Weeks in Event",1,1)
        , type table}}),

    //Remove unneccessary columns
    //  Expand the grouped tables
    //  reset the data types
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"groups"}),
    #"Expanded addedIndex" = Table.ExpandTableColumn(#"Removed Columns1", "addedIndex", {"Pers", "Date", "Event", "Weeks in Event"}, {"Pers", "Date", "Event", "Weeks in Event"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded addedIndex",{{"Pers", type text}, {"Date", type date}, {"Event", type text}, {"Weeks in Event", Int64.Type}})

in
    #"Changed Type1"