CORE27

View Original

Generating series with Postgres

Social websites usually have a feature that displays the users engagement with a site or a log of a particular activity over time.


Here's Microsoft and former StackOverflow champion, Nick Craver's commit streak as an example.

Or something like CrossOutCalendar


Example

For our example, we'll assume user's logging their weights after each workout in a time-series. As an additional scenario we'll assume that users can log their weights as many times in a day as they want.


Goal

What we want is to be able to display a monthly calendar with the weights of the user on the days it was logged and highlight the days where the user didn't log anything.

Here's what our dataset could look like.


generate_series with Postgres

generate_series allows us to generate a series for a specific type. For example, we can generate a series on integers by passing a range

Or the same thing with a date range

So our query looks something like this. We use a few common table expressions to simply the process of combining the date series with the dates with weight logged.


To obtain a single logged weight for a day we average out multiple logs for a given day.

See this content in the original post

And we end up with a table like this.