Please note javascript is required for full website functionality.


Power Query: Revision Time – Part 9

5 June 2024

Welcome to our Power Query blog.  Today, I continue to create a refreshable revision timetable by randomising the subject slots I need for the timetable.


As my salespeople take a well-earned break, many students here in the UK are preparing for exams in the summer.  To help my own offspring get organised, I volunteered to create a refreshable printable revision timetable.  This is the result:

I needed a list of topics, and to begin with, I created extra entries for topics that required more timeslots:

We agreed on half-hourly slots, and I created a grid so that my daughter could indicate the slots that she wouldn’t be able to revise. 

When I first designed the solution, I included some Excel functions, but since this is a Power Query blog, I will ensure that I only use Power Query functions (apart from some formatting at the end!).

In Part 1, I converted my data into two [2] Tables: Subjects and Availability.  I extracted Subjects to Power Query.

I created the Availability query by taking a copy of Subjects, and amending it:

In Part 2, and Part 3, I calculated the number of subjects and the number of slots on Availability.

This gave me both totals:

In Part 4, I calculated how many times each subject will appear in a new query, remembering to round up to whole slots.

This told me the number of slots that each subject should have for my example is three [3]:

In Part 5, I created a table where each subject appeared three times (i.e. the number of times given by Subject_Slots).  

In Part 6, I randomised the order of the slots ready to add to the timetable:

In Part 7, I took a reference copy of the query Availability which I called TimeTable and began to transform it so that it is ready to receive the slot data.

Last time, I appended the slot number data to the rest of the TimeTable query.

This means I have duplicate rows for my slot data, one with data in Slot Number, and one without.  I can’t get rid of the rows without data in Slot Number as I need to retain the rows with ‘x’ in the Value column.  However, I start with a simple filter to get the basic M code:

The step generated is:

The M code is:

= Table.SelectRows(#"Appended Query", each ([Slot Number] <> null))

I need to add some logic to this:

= Table.SelectRows(#"Appended Query", each ([Slot Number] <> null or [Value] = "x"))

This retains all the rows I need:

I may now sort the data into ascending Index order:

This data is now ready to merge with the Random_Subject query.  Next time, I will look at how I would have approached preparing TimeTable by merging instead of appending.


Come back next time for more ways to use Power Query!