Practical SQL

Using GAPS_FILL in BigQuery

Constantin LunguUpdated 1 min read

Photo by Suad Kamardeen on Unsplash

Another new time series function in BigQuery in addition to the ones previously presented is the GAPS_FILL table-valued function.

It allows us to fill in a time series (DATE, DATETIME, TIMESTAMP) with missing rows to a desired time grain.

Previously, one could have solved this by joining with a date dimension or by using GENERATE_DATE_ARRAY for example.

It's simpler now, you just need to provide:
- the table you'd like to fill in
- the column you'd like to fill in (for example a DATE column)
- the interval you'd like the filling in to happen (time grain of the table)

In the example below, it allows us to fill in the time series with 2 missing days.

Since it's a table-valued function, it acts like a table so you select FROM it.

Obligatory remark that this is in 'Preview' for now.

Input data: a transaction_date column with three dates, 2021-01-01, 2021-01-03 and 2021-01-05.

SELECT
  dates.transaction_date

FROM GAP_FILL (
  TABLE learning.dates_with_gaps,
  'transaction_date',
  INTERVAL 1 DAY
) dates

BigQuery results of GAP_FILL: five rows, transaction_date 2021-01-01, 2021-01-02, 2021-01-03, 2021-01-04 and 2021-01-05.

WITH bounds AS (
  SELECT
    MIN(transaction_date) AS start_date,
    MAX(transaction_date) AS end_date
  FROM `learning.dates_with_gaps`
)

SELECT filled_date AS transaction_date
FROM bounds
JOIN UNNEST(GENERATE_DATE_ARRAY(start_date, end_date, INTERVAL 1 DAY)) AS filled_date
LEFT JOIN `learning.dates_with_gaps` dates ON filled_date = dates.transaction_date

BigQuery results of the GENERATE_DATE_ARRAY query: the same five dates, 2021-01-01 through 2021-01-05.