I have a initial table where I have the following rows: ID_0, geom and utilisatio (where the value varies from 1 to 7).
I am trying to create a table where I would have the count of a specific utilisatio value (associated to an ID_0) for every ID_0 that is within a range of 400m. So far I have come up with:
Select a.id_0, a.geom, count (b.utilisatio) as util_1
into new_table
from first_table as a
left join first_table as b ON ST_Dwithin (a.geom, b.geom, 400)
where a.id_0 <> b.id_0
group by a.id_0, a.geom
;
Now my problem is that I don't actually know where to add the following constraint to get only the specified utilisation code:
where utilisatio = 1
I am a beginner self-taught user of Postgres so I am sorry if this question is basic.
Best Answer
As always, the documentation is an excellent reference. In here, it shows
WHERE condition
and condition is defined (further down the page) asHAVING
, as John pointed out in a comment, is for filtering on aggregates after they have been calculated, whileWHERE
is for filtering the rows that are gathered at the start. For example:would return a set of rows where the COUNT(type) result ended up being more than 1.. The filtering done by
HAVING
takes place after the DB has already grouped the entire table by TYPE and calculated allCOUNT()
values. On the other handwould return one row (where type is EXAMPLE) and the count of how many rows contained that type. The filtering here takes place AS THE DB COLLECTS THE ROWS up front .. Any row that doesn't have type 'EXAMPLE' is thrown out. Only one COUNT() is calculated in this instance.
One more complex example to show that the two are evaluated separately and can be combined in any query.