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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
DonnaKelly
Regular Visitor

Filter table based on other filtered table

Hi,

I have a hard-coded PQ text parameter P.

There's a SQL database Table A, filtered where a field = P  (so, 100 rows becomes 36, for example).  This is good so far.

Here's the problem:

I need to filter SQL database Table B, which does not have a field holding P.  I need to filter Table B based on the filtered content of Table A (so, 271 rows becomes 95, for example, where those 95 in Table B have a FieldX equal to the equivalent FieldX in Table A)).

I can create a Custom Step using the fx button . . . but what is the M code for this next filter step?  I think it is going to be something like

        #"Filtered Rows" = Table.SelectRows(TableB, each [FieldX] = ? )

    in

       #"Filtered Rows"

Am I on the right track?

All help gratefully received.

 

3 ACCEPTED SOLUTIONS
watkinnc
Super User
Super User

You really can do what @AlexisOlson advises, but if you'd rather use List.Contains, that's legit as well, like if you don't want the values from Table A (but my first thought was Inner Join as well):

 

Table.SelectRows(TableB, each List.Contains(List.Buffer(List.Distinct(TableA[FieldX])), [FieldX]))

 

--Nate


I’m usually answering from my phone, which means the results are visualized only in my mind. You’ll need to use my answer to know that it works—but it will work!!

View solution in original post

Thanks for this code.

I copied it very carefully, substituting the real names for the dummy ones, but failed dismally. 

More by happenstance than skill, I arrived at 

Table.SelectRows(dbo_TableB, each List.Contains(List.Buffer(List.Distinct(TableA[FieldX])), [FieldX]))

 

I can see what's happening, and why this is doing what I need.

dbo_TableB is referring to the underlying table in the database.  That's good.

TableA is teferring to the filtered TableA which exists after the steps in the M code.   That's also good.

 

Reading the M code as functional programming, and referring to the docs for each method, makes sense of it all.  I've attached the real code for information.

let
    Source = Sql.Database("redwinghealthserver.database.windows.net", "SMIPHC"),
    dbo_PrimaryPatientObservation = Source{[Schema="dbo",Item="PrimaryPatientObservation"]}[Data],
    JustThePatients = Table.SelectRows(dbo_PrimaryPatientObservation, each List.Contains(List.Buffer(List.Distinct(PrimaryPatient[NHSNumber])), [NHSNumber]))
in
    JustThePatients

 

 

 

View solution in original post

You can use that as the table to join with.

= Table.NestedJoin(
    Source, {"FieldX"},
    Table.SelectRows(TableA, each [P] = P), {"FieldX"},
    "TableA", JoinKind.Inner
  )

View solution in original post

9 REPLIES 9
watkinnc
Super User
Super User

You really can do what @AlexisOlson advises, but if you'd rather use List.Contains, that's legit as well, like if you don't want the values from Table A (but my first thought was Inner Join as well):

 

Table.SelectRows(TableB, each List.Contains(List.Buffer(List.Distinct(TableA[FieldX])), [FieldX]))

 

--Nate


I’m usually answering from my phone, which means the results are visualized only in my mind. You’ll need to use my answer to know that it works—but it will work!!

Thanks for this code.

I copied it very carefully, substituting the real names for the dummy ones, but failed dismally. 

More by happenstance than skill, I arrived at 

Table.SelectRows(dbo_TableB, each List.Contains(List.Buffer(List.Distinct(TableA[FieldX])), [FieldX]))

 

I can see what's happening, and why this is doing what I need.

dbo_TableB is referring to the underlying table in the database.  That's good.

TableA is teferring to the filtered TableA which exists after the steps in the M code.   That's also good.

 

Reading the M code as functional programming, and referring to the docs for each method, makes sense of it all.  I've attached the real code for information.

let
    Source = Sql.Database("redwinghealthserver.database.windows.net", "SMIPHC"),
    dbo_PrimaryPatientObservation = Source{[Schema="dbo",Item="PrimaryPatientObservation"]}[Data],
    JustThePatients = Table.SelectRows(dbo_PrimaryPatientObservation, each List.Contains(List.Buffer(List.Distinct(PrimaryPatient[NHSNumber])), [NHSNumber]))
in
    JustThePatients

 

 

 

AlexisOlson
Super User
Super User

How about an inner join of filtered TableA with TableB?

Thanks for this, and I appreciate what you're saying, but I can't do this in SQL, as the hard-coded parameter is a PQ parameter . . . all the filtering needs to be done on the client side.  

Conceptually, what I want to do is JOIN the filtered TableA to TableB (or select from tableB using an EXISTS) and thus generate a filtered TableB based on the TableA subset.  

The way forward looks like some sort of equivalent to an EXISTS like a List.Contains, but I dunno enough M to figure out what to do.

You can absolutely do an inner join in Power Query without any SQL involved. See the link I provided previously or take a look at this more general documentation about merges (joins):

https://docs.microsoft.com/en-us/power-query/merge-queries-overview

Ordinary JOINs are easy - no question.

But I have to admit defeat.  I couldn't figure out how to do a JOIN in PQ on the filtered TableA.  I couldn't figure out  -- in the TableB query -- how to reference the data that existed in the TableA query after this step was applied:

= Table.SelectRows(dbo_TableA, each [P] = P)  [where P is the PQ parameter]

You can use that as the table to join with.

= Table.NestedJoin(
    Source, {"FieldX"},
    Table.SelectRows(TableA, each [P] = P), {"FieldX"},
    "TableA", JoinKind.Inner
  )

This is closer to what I originally meant.  It's also what a SQL person like myself would naturally gravitate to. 

 

Thanks to everyone for a very useful discussion.

The way wrote it is similar to a subquery expression but you can also do it more like a CTE and define the filtered table as a prior step and then reference that step inside the join.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors
Top Kudoed Authors