I have a table for machine installations in this way:
x
installationID, machineID, installed_at, uninstalled_at
A, 1, 2020-01-01, Null
B, 2, 2020-01-01, 2020-01-02
C, 3, 2020-01-02, Null
D, 2, 2020-01-04, Null
I need a query that returns the number of installed machines per day. Like this:
Date, installed
2020-01-01, 2
2020-01-02, 3
2020-01-03, 2
2020-01-04, 3
I know that given a date, say ‘2020-01-03’, I can get the number of installed machines as follows:
SELECT date, count(machineID)
from installs
where installed_at >= '2020-01-03'
and (uninstalled_at is Null or uninstalled_at <= '2020-01-03')
However, I do not know how to query in such a way I can get the result for all dates at one query.
Advertisement
Answer
Using generated series from 2020-01-01 to 2020-01-15. Adjust ‘<= / >’ as needed.
select generate_series dt, count(*) n
from generate_series('2020-01-01'::timestamp , '2020-01-15'::timestamp, '1 day')
left join tbl on installed_at <= generate_series and ( uninstalled_at is null or uninstalled_at > generate_series)
group by generate_series
order by generate_series;