Forum Discussion

FabvE's avatar
FabvE
Helper I
1 year ago
Solved

Remove rows based on same AND other column

Hi, I'm fairly new to PowerBI and have a task to create a dashboard about surveys.   The data sets include the following columns: uniqueId: as the name says an unique id for the entry operation...
  • ronrsnfld's avatar
    ronrsnfld
    1 year ago

    The Source line, where you see the Base64 conversion, is what you get when you paste the data into a table in PowerBI/PowerQuery. You should replace the Source line with your own source. You can read the M code documentation for the Binary.FromText function, but that Base64 argument merely determines the type of Binary encoding to be used.

     

    And either you didn't run the code, or I misunderstood your before and after.

     

    Source Step:

    And you wrote: remove rows 1,4 and keep 2,3,5,6,7

     

    After running code:

    Did I misunderstand what you wanted?  Or did you not run the code to see what it did?

     

    If I misunderstood, what rows did you wish to keep? As the code I provided clearly keeps 2,3,5,6 and 7

     

  • Anonymous's avatar
    Anonymous
    1 year ago

    Hi FabvE ,
    Thanks for ronrsnfld reply.
    You can try the following code

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ndBRC4IwEAfwr3LsOVCnlj1FBX6AICrEB7WjjXSTbeLXbwwJs0HQw8F2cL/9b0VBIrIiR4WVwRPqXgqNtrG3dWGVgaqWg4F2EA3b2V4WRGFAQ5rY81mjiki5Kgh9E7lUnb1c3ThvGNxR84cArqFGY1BNCJ0j1CGxL8dPKJ5DsYMSH3RwEAoYedvCiNAhmslI50bijHS50c1WzjUDqaCX6jmNbr+fX/+zB/34kNRBGx/kz0GzRY7yBQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Unique ID" = _t, Operation = _t, #"From ID" = _t, #"Form Name" = _t, Timestamp = _t, User = _t]),
        AddFormID = Table.AddColumn(Source, "FormID", each if [Operation] = "CreateForm" then [From ID] else null),
        FillDownFormID = Table.FillDown(AddFormID,{"FormID"}),
        FilterCreateResponse = Table.SelectRows(FillDownFormID, each [Operation] = "CreateResponse"),
        AddCustom = Table.AddColumn(FilterCreateResponse, "HasCorrespondingForm", each List.Contains(FillDownFormID[FormID], [From ID])),
        RemoveInvalidResponses = Table.SelectRows(AddCustom, each [HasCorrespondingForm] = true),
        CombineTables = Table.Combine({Table.SelectRows(FillDownFormID, each [Operation] = "CreateForm"), RemoveInvalidResponses}),
        SortByUniqueID = Table.Sort(CombineTables,{{"Unique ID", Order.Ascending}}),
        RemoveHelperColumns = Table.RemoveColumns(SortByUniqueID,{"FormID", "HasCorrespondingForm"})
    in
        RemoveHelperColumns

    Final output

    Best regards,
    Albert He


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

  • FabvE's avatar
    1 year ago

    Ok, after many tries and more fails I went with another approach which solved my problem.

    I created an addinional query which contained only the created records:

    let
    Quelle = Table.SelectRows(Auswertung_raw, each [Operation] = "CreateForm")
    in
    Quelle

    I then used Merge queries to do a join between the initial table Auswertung_raw and the CreateForm-Table:

    let
    Quelle = Table.NestedJoin(Auswertung_raw, {"FormId"}, tblErstellteUmfragen, {"FormId"}, "tblErstellteUmfragen", JoinKind.LeftSemi),
    #"Entfernte Duplikate" = Table.Distinct(Quelle, {"RecordId"})
    in
    #"Entfernte Duplikate"

    This gives me a table with all responses which have a corresponding CreateForm + the initial CreateForm-entries.

     

    Nevertheless, thank you all - especially ronrsnfld- for your help and time! 👍