Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Get Fabric Certified for FREE during Fabric Data Days. Don't miss your chance! Request now

Reply
Dalton948
Frequent Visitor

Iterated time difference based on a group of unique IDs

I am trying to work through a formula but i can't seem to find a way to order a filter variable.

Dalton948_0-1732556947587.png

From the sample data above, I am trying to grab each instances of the ID and sort them ascending\descending on NextReplyTime. 

Past that, i am going to need to figure out an if statement that will allow me to self identify by comparing its current time with the list and then do a datediff between the previous iteration. 

The End goal is to calculate the time difference between the CreatedDateTime column and the first NextReplyTime and then also, calculate the time difference between each NextReplyTime from the previous NextReplyTime.

Hope that makes sense, any help is welcome. I have to be doing something wrong for the Order by function does not appear.

1 ACCEPTED SOLUTION
Anonymous
Not applicable

Hi @Dalton948 ,

 

Thanks for reaching out to our community.

For your first requirement about sorting them on NextReplyTime group by ID, you can sort twice in order, as shown below, first click on the ID column to sort in ascending order, and then click on the NextReplyTime column to sort in ascending order. In the end, you can see that they sort the NextReplyTime columns by ID grouping, and you can also see that there are sorted sequences 1 and 2 next to the field name.

vstephenmsft_1-1732604622338.pngvstephenmsft_2-1732604629977.png

vstephenmsft_0-1732604606777.png

Your second requirement is that you want to get the value from previous row in groups. Here're to methods.

Method1:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZVLT9tAFIX/yigrkJC4r3nuopQFi1SRqNoFsAjgIquJIzkpEv++11gxngGkvrwdHc/5fM/x9fX1DD0jeGBG8mF2Nlu1u6f6oWrNt/Vhv2vMYvfY1If6qTJXVftU31d7s9qsD9937VbViOfhnIDE+GQpIc6X3aneiQDRkROfqSQRJSGz6mSz27Pp/CFyQGstZCpKxInti/3rKSeCxE5PJyUKjikQuEyFqglJQoHUg06O5CMF9oI5EiRC9Tfz5buoZnIqClact5kqJJaEUjL1rN3xgBSDpwiuS35Zbe8U6GJTP9Z39aY+PB9Zzj9dfV6Zk69V87BrT4s6iE0U+5L2N0YvMQQpugyaUiyC6xvO2YyiZQLvWYXzzXr/Y20umna32Wyr5mAu9/uflTm5/HJaFEB01jBi8MSO0X/Q3DdkDCMGfQNyLljsclrMr4zmUDX3zyNfPwwUfRfyMQ591AUHw9sfdTp11UGRR5+SNfN/sB45iwAj+1Imrhvx0TonwrE1CnEI0f1xFdxQedYBh9WAxHohB2czmU3MCXi1/BB0SiIEJzb6gkjHAWKOSBmoZM34/0TEETQ5yWTcEck7RB2onZgIndUJOcxlCWLCWBKNQI9EIUYkCq4jWqzbSjfdtm60xVX2ZHjZj/TaX7AM7Cgvi9YC1IDny7c0BH9h+44vBOuix4JOvO6K0ranGS1Q0D9CQOCXX/fvzv/mpumvtcMQXbLD+lIesD7oy2Qq/TrikFMB6s00SOaVSbw4jEKZzCbbbZGhFW9Qb29/AQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [id = _t, Application = _t, createdDateTime = _t, replies.id = _t, replies.createdDateTime = _t, NextReplyTime = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"id", type text}, {"Application", type text}, {"createdDateTime", type datetime}, {"replies.id", type text}, {"replies.createdDateTime", type datetime}, {"NextReplyTime", type datetime}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"id", Order.Ascending}, {"NextReplyTime", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"id"}, {{"allrows", each Table.AddIndexColumn(_,"index",0,1)}}),
    Custom1 = Table.TransformColumns(#"Grouped Rows",{"allrows", (x)=> Table.AddColumn(x,"previoustime", each try x{[index]-1}[NextReplyTime] otherwise null)}),
    #"Expanded allrows" = Table.ExpandTableColumn(Custom1, "allrows", {"Application", "createdDateTime", "replies.id", "replies.createdDateTime", "NextReplyTime", "index", "previoustime"}, {"allrows.Application", "allrows.createdDateTime", "allrows.replies.id", "allrows.replies.createdDateTime", "allrows.NextReplyTime", "allrows.index", "allrows.previoustime"})
in
    #"Expanded allrows"

 

vstephenmsft_3-1732607003728.png

 

Method2:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZVLT9tAFIX/yigrkJC4r3nuopQFi1SRqNoFsAjgIquJIzkpEv++11gxngGkvrwdHc/5fM/x9fX1DD0jeGBG8mF2Nlu1u6f6oWrNt/Vhv2vMYvfY1If6qTJXVftU31d7s9qsD9937VbViOfhnIDE+GQpIc6X3aneiQDRkROfqSQRJSGz6mSz27Pp/CFyQGstZCpKxInti/3rKSeCxE5PJyUKjikQuEyFqglJQoHUg06O5CMF9oI5EiRC9Tfz5buoZnIqClact5kqJJaEUjL1rN3xgBSDpwiuS35Zbe8U6GJTP9Z39aY+PB9Zzj9dfV6Zk69V87BrT4s6iE0U+5L2N0YvMQQpugyaUiyC6xvO2YyiZQLvWYXzzXr/Y20umna32Wyr5mAu9/uflTm5/HJaFEB01jBi8MSO0X/Q3DdkDCMGfQNyLljsclrMr4zmUDX3zyNfPwwUfRfyMQ591AUHw9sfdTp11UGRR5+SNfN/sB45iwAj+1Imrhvx0TonwrE1CnEI0f1xFdxQedYBh9WAxHohB2czmU3MCXi1/BB0SiIEJzb6gkjHAWKOSBmoZM34/0TEETQ5yWTcEck7RB2onZgIndUJOcxlCWLCWBKNQI9EIUYkCq4jWqzbSjfdtm60xVX2ZHjZj/TaX7AM7Cgvi9YC1IDny7c0BH9h+44vBOuix4JOvO6K0ranGS1Q0D9CQOCXX/fvzv/mpumvtcMQXbLD+lIesD7oy2Qq/TrikFMB6s00SOaVSbw4jEKZzCbbbZGhFW9Qb29/AQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [id = _t, Application = _t, createdDateTime = _t, replies.id = _t, replies.createdDateTime = _t, NextReplyTime = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"id", type text}, {"Application", type text}, {"createdDateTime", type datetime}, {"replies.id", type text}, {"replies.createdDateTime", type datetime}, {"NextReplyTime", type datetime}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"id", Order.Ascending}, {"NextReplyTime", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"id"}, {{"allrows", each Table.AddIndexColumn(_,"index",0,1)}}),
    Custom1 = Table.TransformColumns(#"Grouped Rows",{"allrows", (x)=> Table.AddColumn(x,"previoustime",each List.Range(x[NextReplyTime],_[index]-1,1)) }),
    #"Expanded allrows" = Table.ExpandTableColumn(Custom1, "allrows", {"Application", "createdDateTime", "replies.id", "replies.createdDateTime", "NextReplyTime", "index", "previoustime"}, {"allrows.Application", "allrows.createdDateTime", "allrows.replies.id", "allrows.replies.createdDateTime", "allrows.NextReplyTime", "allrows.index", "allrows.previoustime"}),
    #"Extracted Values" = Table.TransformColumns(#"Expanded allrows", {"allrows.previoustime", each Text.Combine(List.Transform(_, Text.From)), type text}),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Extracted Values", {{"allrows.previoustime", ""}})
in
    #"Replaced Errors"

 

vstephenmsft_4-1732607017367.png

Then you can easily calculate the difference.

Reference: Value from previous row – Power Query, M language – Trainings, consultancy, tutorials

You can also download my attachment for more details.

 

Best Regards,

Stephen Tao

 

If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

View solution in original post

2 REPLIES 2
Anonymous
Not applicable

Hi @Dalton948 ,

 

Thanks for reaching out to our community.

For your first requirement about sorting them on NextReplyTime group by ID, you can sort twice in order, as shown below, first click on the ID column to sort in ascending order, and then click on the NextReplyTime column to sort in ascending order. In the end, you can see that they sort the NextReplyTime columns by ID grouping, and you can also see that there are sorted sequences 1 and 2 next to the field name.

vstephenmsft_1-1732604622338.pngvstephenmsft_2-1732604629977.png

vstephenmsft_0-1732604606777.png

Your second requirement is that you want to get the value from previous row in groups. Here're to methods.

Method1:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZVLT9tAFIX/yigrkJC4r3nuopQFi1SRqNoFsAjgIquJIzkpEv++11gxngGkvrwdHc/5fM/x9fX1DD0jeGBG8mF2Nlu1u6f6oWrNt/Vhv2vMYvfY1If6qTJXVftU31d7s9qsD9937VbViOfhnIDE+GQpIc6X3aneiQDRkROfqSQRJSGz6mSz27Pp/CFyQGstZCpKxInti/3rKSeCxE5PJyUKjikQuEyFqglJQoHUg06O5CMF9oI5EiRC9Tfz5buoZnIqClact5kqJJaEUjL1rN3xgBSDpwiuS35Zbe8U6GJTP9Z39aY+PB9Zzj9dfV6Zk69V87BrT4s6iE0U+5L2N0YvMQQpugyaUiyC6xvO2YyiZQLvWYXzzXr/Y20umna32Wyr5mAu9/uflTm5/HJaFEB01jBi8MSO0X/Q3DdkDCMGfQNyLljsclrMr4zmUDX3zyNfPwwUfRfyMQ591AUHw9sfdTp11UGRR5+SNfN/sB45iwAj+1Imrhvx0TonwrE1CnEI0f1xFdxQedYBh9WAxHohB2czmU3MCXi1/BB0SiIEJzb6gkjHAWKOSBmoZM34/0TEETQ5yWTcEck7RB2onZgIndUJOcxlCWLCWBKNQI9EIUYkCq4jWqzbSjfdtm60xVX2ZHjZj/TaX7AM7Cgvi9YC1IDny7c0BH9h+44vBOuix4JOvO6K0ranGS1Q0D9CQOCXX/fvzv/mpumvtcMQXbLD+lIesD7oy2Qq/TrikFMB6s00SOaVSbw4jEKZzCbbbZGhFW9Qb29/AQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [id = _t, Application = _t, createdDateTime = _t, replies.id = _t, replies.createdDateTime = _t, NextReplyTime = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"id", type text}, {"Application", type text}, {"createdDateTime", type datetime}, {"replies.id", type text}, {"replies.createdDateTime", type datetime}, {"NextReplyTime", type datetime}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"id", Order.Ascending}, {"NextReplyTime", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"id"}, {{"allrows", each Table.AddIndexColumn(_,"index",0,1)}}),
    Custom1 = Table.TransformColumns(#"Grouped Rows",{"allrows", (x)=> Table.AddColumn(x,"previoustime", each try x{[index]-1}[NextReplyTime] otherwise null)}),
    #"Expanded allrows" = Table.ExpandTableColumn(Custom1, "allrows", {"Application", "createdDateTime", "replies.id", "replies.createdDateTime", "NextReplyTime", "index", "previoustime"}, {"allrows.Application", "allrows.createdDateTime", "allrows.replies.id", "allrows.replies.createdDateTime", "allrows.NextReplyTime", "allrows.index", "allrows.previoustime"})
in
    #"Expanded allrows"

 

vstephenmsft_3-1732607003728.png

 

Method2:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZVLT9tAFIX/yigrkJC4r3nuopQFi1SRqNoFsAjgIquJIzkpEv++11gxngGkvrwdHc/5fM/x9fX1DD0jeGBG8mF2Nlu1u6f6oWrNt/Vhv2vMYvfY1If6qTJXVftU31d7s9qsD9937VbViOfhnIDE+GQpIc6X3aneiQDRkROfqSQRJSGz6mSz27Pp/CFyQGstZCpKxInti/3rKSeCxE5PJyUKjikQuEyFqglJQoHUg06O5CMF9oI5EiRC9Tfz5buoZnIqClact5kqJJaEUjL1rN3xgBSDpwiuS35Zbe8U6GJTP9Z39aY+PB9Zzj9dfV6Zk69V87BrT4s6iE0U+5L2N0YvMQQpugyaUiyC6xvO2YyiZQLvWYXzzXr/Y20umna32Wyr5mAu9/uflTm5/HJaFEB01jBi8MSO0X/Q3DdkDCMGfQNyLljsclrMr4zmUDX3zyNfPwwUfRfyMQ591AUHw9sfdTp11UGRR5+SNfN/sB45iwAj+1Imrhvx0TonwrE1CnEI0f1xFdxQedYBh9WAxHohB2czmU3MCXi1/BB0SiIEJzb6gkjHAWKOSBmoZM34/0TEETQ5yWTcEck7RB2onZgIndUJOcxlCWLCWBKNQI9EIUYkCq4jWqzbSjfdtm60xVX2ZHjZj/TaX7AM7Cgvi9YC1IDny7c0BH9h+44vBOuix4JOvO6K0ranGS1Q0D9CQOCXX/fvzv/mpumvtcMQXbLD+lIesD7oy2Qq/TrikFMB6s00SOaVSbw4jEKZzCbbbZGhFW9Qb29/AQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [id = _t, Application = _t, createdDateTime = _t, replies.id = _t, replies.createdDateTime = _t, NextReplyTime = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"id", type text}, {"Application", type text}, {"createdDateTime", type datetime}, {"replies.id", type text}, {"replies.createdDateTime", type datetime}, {"NextReplyTime", type datetime}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"id", Order.Ascending}, {"NextReplyTime", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"id"}, {{"allrows", each Table.AddIndexColumn(_,"index",0,1)}}),
    Custom1 = Table.TransformColumns(#"Grouped Rows",{"allrows", (x)=> Table.AddColumn(x,"previoustime",each List.Range(x[NextReplyTime],_[index]-1,1)) }),
    #"Expanded allrows" = Table.ExpandTableColumn(Custom1, "allrows", {"Application", "createdDateTime", "replies.id", "replies.createdDateTime", "NextReplyTime", "index", "previoustime"}, {"allrows.Application", "allrows.createdDateTime", "allrows.replies.id", "allrows.replies.createdDateTime", "allrows.NextReplyTime", "allrows.index", "allrows.previoustime"}),
    #"Extracted Values" = Table.TransformColumns(#"Expanded allrows", {"allrows.previoustime", each Text.Combine(List.Transform(_, Text.From)), type text}),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Extracted Values", {{"allrows.previoustime", ""}})
in
    #"Replaced Errors"

 

vstephenmsft_4-1732607017367.png

Then you can easily calculate the difference.

Reference: Value from previous row – Power Query, M language – Trainings, consultancy, tutorials

You can also download my attachment for more details.

 

Best Regards,

Stephen Tao

 

If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

Omid_Motamedise
Super User
Super User

For doing this, you do not need to sort the rows, just filter the rows related to data after your desired dates and then use table.min function


If my answer helped solve your issue, please consider marking it as the accepted solution.

Helpful resources

Announcements
Fabric Data Days Carousel

Fabric Data Days

Advance your Data & AI career with 50 days of live learning, contests, hands-on challenges, study groups & certifications and more!

October Power BI Update Carousel

Power BI Monthly Update - October 2025

Check out the October 2025 Power BI update to learn about new features.

FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.

Top Kudoed Authors