I’ve got a problem where my count(*) will return the number of rows before distinct rows are filtered.
This is a simplified version of my query. Note that I’ll extract a lot of other data from the tables, so group by won’t return the same result, as I’d have to group by maybe 10 columns. The way it works is that m is a map mapping q, c and kl, so there can be several references to q.id. I only want one.
SELECT distinct on (q.id) count(*) over() as full_count
from q, c, kl, m
where c.id = m.chapter_id
and q.id = m.question_id
and q.active = 1
and c.class_id = m.class_id
and kl.id = m.class_id
order by q.id asc
If I run this i get full_count = 11210 while it only returns 9137 rows. If I run it without the distinct on (q.id), distinct on (q.id) is indeed the number of rows.
So it seems that the count function doesn’t have access to the filtered rows. How can I solve this? Do I need to rethink my approach?
Can you use a subquery:
But the
group byis the right approach. The key worddistinctinselectis really just syntactic sugar for doing a group by on all non-aggregate-functioned columns.