tengo una consulta como esta
SELECT d.create_at :: DATE AS dates, count(r.id) AS usages FROM reports r LEFT JOIN dispatches d ON r.dispatch_id = d.id LEFT JOIN messages m ON d.message_id = m.id WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6 GROUP BY dates ORDER BY dates;que generará un resultado como este

no hay datos en la fecha 2020-05-03 y 2020-05-08, por lo que no se mostrarán en el resultado
¿Cómo agrego esas fechas que no tienen datos y doy el dato de conteo 0 como valor?
Lo siento, soy nuevo en Postgres y DB en general.
He seguido varias soluciones de todas partes y no parece obtener el resultado que quiero todavía
Trato de usar generate_series pero no salió ningún resultado
SELECT x.day AS dates, count(r.id) AS usages FROM ( SELECT generate_series(timestamp '2020-05-01' , timestamp '2020-05-10' , interval '1 day')::date ) x(day) left join dispatches d on d.create_at = x.day LEFT JOIN reports r ON d.id = r.dispatch_id LEFT JOIN messages m ON d.message_id = m.id WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6 GROUP BY dates ORDER BY dates;Lo siento si me estoy perdiendo algo obvio. Cualquier ayuda sería apreciada gracias!
Estuvo cerca, pero su cláusula WHERE convierte la combinación externa nuevamente en una combinación interna. Debe mover esa condición a la condición JOIN.
SELECT x.day AS dates, count(r.id) AS usages FROM ( SELECT generate_series(timestamp '2020-05-01' , timestamp '2020-05-10' , interval '1 day')::date ) x(day) left join dispatches d on d.create_at = x.day LEFT JOIN reports r ON d.id = r.dispatch_id and r.status = 'SUCCESS' AND r.update_at::DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6 LEFT JOIN messages m ON d.message_id = m.id GROUP BY dates ORDER BY dates;Utilice la siguiente consulta,
SELECT dt.date_seq :: DATE AS dates, count(r.id) AS usages FROM reports r LEFT JOIN dispatches d ON r.dispatch_id = d.id LEFT JOIN messages m ON d.message_id = m.id FULL OUTER JOIN (select CURRENT_DATE + i as date_seq from generate_series(date '2020- 05-01'- CURRENT_DATE, date '2020-05-10' - CURRENT_DATE ) i) dt ON d.create_at = dt.date_seq WHERE r.status = 'SUCCESS' AND r.update_at :: DATE BETWEEN DATE '2020-05-01' AND '2020-05-10' AND m.client_id = 6 GROUP BY dates ORDER BY dates;