Table.Partition Function in Power Query
The Table.Partition function in Power Query, partitions the table into a list of groups number of tables, based on the value of the column of each row and a hash function.
Syntax
Table.Partition( table as table, column as text, groups as number, hash as function ) as list
The function has the following parameters:
- table: The table to partition.
- column: The column to hash to determine which returned table the row is in.
- groups: The number of tables the input table will be partitioned into.
- hash: The function applied to obtain a hash value.
How It Works
- Take the value from the specified column in each row.
- Apply the hash function to that value.
- Use the formula: hashValue mod groups to decide which partition (table) the row goes into.
- Returns a list of groups number of tables, each containing rows assigned to that partition.
Example: Partitioning by Name Length.
Power Query M
let Source = Table.FromRecords( { [CustomerID = 1, Name = "Ashish", Marks = 568], [CustomerID = 2, Name = "Katrina", Marks = 855], [CustomerID = 3, Name = "Alia", Marks = 380], [CustomerID = 4, Name = "Vicky", Marks = 458], [CustomerID = 5, Name = "Mohini", Marks = 278], [CustomerID = 6, Name = "Meenakshi", Marks = 289], [CustomerID = 7, Name = "Esha", Marks = 875], [CustomerID = 8, Name = "Anjali", Marks = 380] } ), return = Table.Partition( Source, "Name", 3, each Text.Length(_) ) in return
How it works:
- The hash is Text.Length(_) (length of the Name).
- Modulo 3 → Text.Length(_) mod 3 determines which partition the row goes to.
- Partition Index = Text.Length(Name) mod 3
Partitioned output (list of 3 tables):
{ // Partition 0: Names with length mod 3 = 0 (6, 9) Table.FromRecords({ [CustomerID = 1, Name = "Ashish", Marks = 568], [CustomerID = 5, Name = "Mohini", Marks = 278], [CustomerID = 6, Name = "Meenakshi", Marks = 289], [CustomerID = 8, Name = "Anjali", Marks = 380] }), // Partition 1: Names with length mod 3 = 1 (4, 7) Table.FromRecords({ [CustomerID = 2, Name = "Katrina", Marks = 855], [CustomerID = 3, Name = "Alia", Marks = 380], [CustomerID = 7, Name = "Esha", Marks = 875] }), // Partition 2: Names with length mod 3 = 2 (5) Table.FromRecords({ [CustomerID = 4, Name = "Vicky", Marks = 458] }) }
Example: Partitioning by CustomerID (Even/Odd).
Power Query M
let Source = Table.FromRecords( { [CustomerID = 1, Name = "Ashish", Marks = 568], [CustomerID = 2, Name = "Katrina", Marks = 855], [CustomerID = 3, Name = "Alia", Marks = 380], [CustomerID = 4, Name = "Vicky", Marks = 458], [CustomerID = 5, Name = "Mohini", Marks = 278], [CustomerID = 6, Name = "Meenakshi", Marks = 289], [CustomerID = 7, Name = "Esha", Marks = 875], [CustomerID = 8, Name = "Anjali", Marks = 380] } ), return = Table.Partition( Source, "CustomerID", 2, each _ // identity hash function ) in return
How it works:
- The hash function is each _ (returns the value of CustomerID).
- Modulo 2 → CustomerID mod 2 determines the partition.
Partitioned output (list of 2 tables):
{ // Partition 0: Even CustomerIDs (mod 2 = 0) Table.FromRecords({ [CustomerID = 2, Name = "Katrina", Marks = 855], [CustomerID = 4, Name = "Vicky", Marks = 458], [CustomerID = 6, Name = "Meenakshi", Marks = 289], [CustomerID = 8, Name = "Anjali", Marks = 380] }), // Partition 1: Odd CustomerIDs (mod 2 = 1) Table.FromRecords({ [CustomerID = 1, Name = "Ashish", Marks = 568], [CustomerID = 3, Name = "Alia", Marks = 380], [CustomerID = 5, Name = "Mohini", Marks = 278], [CustomerID = 7, Name = "Esha", Marks = 875] }) }
Accessing Partitions We can access each partition using list indexing syntax:
Power Query M
PartitionList{Index}
Explanation:
- PartitionList is the list returned by Table.Partition(...).
- Indexing in Power Query is zero-based: first partition = {0}, second = {1}, etc.
- For example, PartitionList{0} returns the first partition table, and PartitionList{1} returns the second.
Example: Accessing individual partitions.
Power Query M
let Source = Table.FromRecords({ [CustomerID = 1, Name = "Ashish", Marks = 568], [CustomerID = 2, Name = "Katrina", Marks = 855], [CustomerID = 3, Name = "Alia", Marks = 380], [CustomerID = 4, Name = "Vicky", Marks = 458], [CustomerID = 5, Name = "Mohini", Marks = 278], [CustomerID = 6, Name = "Meenakshi", Marks = 289], [CustomerID = 7, Name = "Esha", Marks = 875], [CustomerID = 8, Name = "Anjali", Marks = 380] }), PartitionList = Table.Partition(Source, "CustomerID", 2, each _), // list of 2 tables Partition0 = PartitionList{0}, // Access first partition (even CustomerIDs) Partition1 = PartitionList{1} // Access second partition (odd CustomerIDs) in Partition0 // or Partition1 depending on which you want to return
Note: If we want to combine all partitions back into a single table, use:
Power Query M
Table.Combine(PartitionList)