Forum Discussion

MJEnnis's avatar
MJEnnis
Resolver III
1 year ago
Solved

Power Query: Apply Filter Expression Only if Condition Met in Another Column

I have the following filter expression: 

= Table.SelectRows(#"Expanded All", each ([Column1] >= [Column4] and [Column1] <= [Column5]) or ([Column2] >= [Column4] and [Column2] <= [Column5])
)

 

That works fine. But I want to apply it only 

if [Column3] > 1

 

Column3 counts eroneous duplicate rows after a Left Outer Join, and this is the only logic I can find to not remove rows without duplicates that I need to keep.

 

Anyone know a way to add the if statement to the filter expresion?

 

Thanks

  • The next step is to rearrange the query so that the most frequently encountered condition is tested for first etc.

  • There turned out to be some unexpected instances of duplicatation where both range statements were true. (errors in the data) So the final version that worked was: 

    = Table.SelectRows(#"Expanded All", each 
        [Column3] = 1 or 
        [Column1] >= [Column4] and [Column1] <= [Column5] or 
         not ([Column1] >= [Column4] and [Column1] <= [Column5]) and 
            [Column2] >= [Column4] and [Column2] <= [Column5]
    )

     

13 Replies

  • concatenate both filters -

    = Table.SelectRows(#"Expanded All", each [Column1] >= [Column4] and [Column1] <= [Column5]) or ([Column2] >= [Column4] and [Column2] <= [Column5] and [Column3]>1
    )
    • MJEnnis's avatar
      MJEnnis
      Resolver III

      Hi lbendlin! You have helped me several times in the past, and I definitely trust you over AI! Two questions: 

      1) I do not understand the placement of the parentheses. For example, should there be another parenthesis before the first instance of [Column1]?
      2) Why do you add the new condition statement onto the end of the second filter option? Shouldn't it be separated by parenthesis?
      3) The one ChatGPT gives me makes sense to me. But I am not familiar enough with M to undertand yours. Is your solution more efficient?

    • MJEnnis's avatar
      MJEnnis
      Resolver III

      Based on what you said above about the order of operations for M, I think this is what I actually want:

      = Table.SelectRows(#"Expanded All", each [Column1] >= [Column4] and [Column1] <= [Column5] or [Column2] >= [Column4] and [Column2] <= [Column5] or [Column3]=1
      )

       

      But this is basically the equivalent of what ChatGPT produced, just without the unnecessary parentheses.

       

      My only doubt is that I want to be sure that [Column3]=1 is prioritized. I want to keep all rows where column 3 = 1, even if the other conditions would filter them out.

       

      • lbendlin's avatar
        lbendlin
        Super User

        You have a second "or"  statement there that is unprotected. Is that what you want? 

         

        Table.SelectRows(#"Expanded All", each 
        
        [Column1] >= [Column4] and [Column1] <= [Column5] 
        or [Column2] >= [Column4] and [Column2] <= [Column5] 
        or [Column3]=1
        
        )
  • MJEnnis's avatar
    MJEnnis
    Resolver III

    Wow! I never use AI for coding purposes. But I am in a pinch here, and Chat GPT just gave me this solution:

    = Table.SelectRows(
        #"Expanded All",
        each 
            ([Column3] <= 1) or 
            (
                ([Column1] >= [Column4] and [Column1] <= [Column5]) or
                ([Column2] >= [Column4] and [Column2] <= [Column5])
            )
    )

     

    Will be impressed if that works!

    • lbendlin's avatar
      lbendlin
      Super User

      That AI answer is, uhm, not very correct.

  • MJEnnis's avatar
    MJEnnis
    Resolver III

    lbendlin 

    Below was my prompt for ChatGPT. Maybe I explained what I want more clearly for AI, because I know how "artificial" it can be. 😄 Will your solution accomplish what I describe below?

    I have the following expression to filter rows based on a column:

    = Table.SelectRows(#"Expanded All", each ([Column1] >= [Column4] and [Column1] <= [Column5]) or ([Column2] >= [Column4] and [Column2] <= [Column5])
    )

    But I only want to apply the filter if a condition is met in a column currently not referenced in the expression. I want to keep all rows that do not meet the condition, and I want to apply the above filter only to rows that meet that contion.

    This is the condition:

    if [Column3] > 1

    Is there a way to add this condition to the above expression to achieve my goal?



  • MJEnnis's avatar
    MJEnnis
    Resolver III

    There turned out to be some unexpected instances of duplicatation where both range statements were true. (errors in the data) So the final version that worked was: 

    = Table.SelectRows(#"Expanded All", each 
        [Column3] = 1 or 
        [Column1] >= [Column4] and [Column1] <= [Column5] or 
         not ([Column1] >= [Column4] and [Column1] <= [Column5]) and 
            [Column2] >= [Column4] and [Column2] <= [Column5]
    )