I have data in my table of the following form:
x
| date | type | value |
+----------+------+-------+
|2020-01-01| A | 29|
|2020-02-01| A | 32|
|2020-04-01| A | 56|
|2020-05-01| A | 78|
|2020-01-01| B | 12|
|2020-02-01| B | 89|
|2020-03-01| B | 44|
|2020-05-01| B | 33|
Now while querying this data, I want the missing dates to be filled with null values.
In PostgreSQL, I can use generate_series()
to create a series of dates and then left join with it. But that only works if I have just a series of dates and values. In this case, since I have two types, I don’t really have any missing dates in the series as a whole, but I have missing dates in each group/partition.
Is it possible to use generate_series()
with left join to fill rows with null in this case?
Advertisement
Answer
You may cross join with a table which contains all types, and then use the same left join approach you were already considering:
SELECT
date_trunc('day', cal)::date AS date,
t1.type,
t2.value
FROM generate_series
( '2020-01-01'::timestamp
, '2020-12-31'::timestamp
, '1 day'::interval) cal
CROSS JOIN (SELECT DISTINCT type FROM yourTable) t1
LEFT JOIN yourTable t2
ON t2.date = cal.date AND t2.type = t1.type
ORDER BY
t1.type,
cal.date;