Forum Discussion
Which row will keep Table.Distinct(Table, {"Column"})
Ok, this is pretty weird.
I ran the tests again, but instead of reordering the table using Table.Sort I just entered the data in a different order from the start.
Here are the results:
(For some reason I can't embed images even though I had no such problem yesterday. Sorry if this is harder to follow or the images eventually go down)
Code:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclLSUUpUitWJVnJEYSUpxcYCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [a = _t, b = _t]),
Example = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}),
ExampleResult = Table.Distinct(Example, {"b"}),
ReorderedExample = Table.Sort(Example,{{"a", Order.Ascending}}),
ReorderedExampleResult = Table.Distinct(ReorderedExample, {"b"})
in
ReorderedExampleResult
We can easily see that order is indeed important, but that for some reason reordering the table using Table.Sort doesn't make a difference. I found that if we need to, we can use Table.Buffer to make Table.Distinct take into account the changes made by Table.Sort. Here's my third and final test:
Code:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUUpUitWJVnKCs0BiSUqxsQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [a = _t, b = _t]),
Example = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}),
ExampleResult = Table.Distinct(Example, {"b"}),
ReorderedExample = Table.Buffer( Table.Sort(Example,{{"a", Order.Descending}}) ),
ReorderedExampleResult = Table.Distinct(ReorderedExample, {"b"})
in
ReorderedExampleResult
Thank you for doing the work of looking into this and identifying a solution to this frustrating issue.
- Anonymous5 years agoNot applicable
it seems as if the sort operation doesn't change the table from the point of view of the table.distinct function and uses the same result as before.(*)
The operations that "change" the table (manual reordering, table.buffer, adding an index column, replacing any value in the table - even if the new value is the same as the old one -, changing the type of a column) do " start " the procedure of the table.distinct function all over again
(*) if between the call to the table.distinct function and the definition of the table to which it is applied, only table.sort functions act, the table distinct function is applied to the original table "saving" the sorting operation which is generally heavy.
Maybe 😁- Anonymous5 years agoNot applicable
table.group also appears to have similar behavior to table.distinct.
After all, a possible algorithm to eliminate duplicates in pseudocode could be like this:Table.Group (tab, "col", each Table.First (_) [all columns but "col"])
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUUpUitWJVjJCYSWBWcZwMUOIWCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [a = _t, b = _t]), Example = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Raggruppate righe" = Table.Group(Example, {"b"}, {{"all", each Table.First(_)[a]}}), Example1 = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Ordinate righe" = Table.Sort(Example1,{{"a", Order.Descending}}), #"Raggruppate righe1" = Table.Group(#"Ordinate righe", {"b"}, {{"all", each List.First(_[a]) }}) in #"Raggruppate righe1"in the following form the "problem" doesn't arise:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUUpUitWJVjJCYSWBWcZwMUOIWCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [a = _t, b = _t]), Example = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Raggruppate righe" = Table.Group(Example, {"b"}, {{"all", each _}}), Example1 = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Ordinate righe" = Table.Sort(Example1,{{"a", Order.Descending}}), #"Raggruppate righe1" = Table.Group(#"Ordinate righe", {"b"}, {{"all", each _ }}) in #"Raggruppate righe1"and not even like this
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUUpUitWJVjJCYSWBWcZwMUOIWCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [a = _t, b = _t]), Example = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Raggruppate righe" = Table.Group(Example, {"b"}, {{"all", each _[a]{0}}}), Example1 = Table.TransformColumnTypes(Source,{{"a", type text}, {"b", type text}}), #"Ordinate righe" = Table.Sort(Example1,{{"a", Order.Descending}}), #"Raggruppate righe1" = Table.Group(#"Ordinate righe", {"b"}, {{"all", each _[a]{0} }}) in #"Raggruppate righe1"- Anonymous5 years agoNot applicable
About table.sort ...
Suppose you have this table:
if you sort by column a, you get this:
but even this different situation would have been valid (third and fourth row are reversed):
This, I believe, depends on the internal algorithm used to do the sorting.
If, as plausible as it may be, the table.distinct algorithm first does a sort of rows to "group" the rows that have duplicate values in the control columns, the ordering of the remaining columns, as we have seen, is not determined.
So if the algorithm also takes the first row of the group, it is not necessarily the "first" row you encounter the source table.