On Mon, 17 Jul 2023 at 21:13, basti <mailinglist@xxxxxxxxxxxxxxxx> wrote: > volkszaehler=# explain analyze SELECT COUNT(DISTINCT DATE_TRUNC('day', > TIMESTAMP 'epoch' + timestamp * INTERVAL '1 millisecond')) FROM data > WHERE channel_id = 5 AND timestamp >= 0; Alternatively, you could express this as: SELECT COUNT(*) FROM (SELECT DISTINCT DATE_TRUNC('day', TIMESTAMP 'epoch' + timestamp * INTERVAL '1 millisecond')) FROM data WHERE channel_id = 5 AND timestamp >= 0) a; If there was an index on (channel_id, (DATE_TRUNC('day', TIMESTAMP 'epoch' + timestamp * INTERVAL '1 millisecond'))); then the distinct could efficiently perform a Group Aggregate. Otherwise, it could at least hash aggregate and the distinct could be done in parallel (assuming you're using at least PostgreSQL 15). The yet-to-be-released PostgreSQL 16 will allow more efficient execution of DISTINCT and ORDER BY aggregates by allowing indexed to provide pre-sorted input. In the meantime, the query above will probably help you. David