@nbeuchat,

I found your idea interesting, at least from my point of view,

**But** function ST_Buffer() distorts the boundaries and so you don't mind my suggestion next,

 run your script without ST_Buffer and see the result :-)...

```
SELECT (ST_MakePolygon(ST_ExteriorRing(ST_Union(
ST_Difference(ST_ConvexHull(ST_Union(geom)), ST_Collect(ST_Convexhull(geom))), ST_Collect(geom)))))
FROM (SELECT *, 1 as group_id FROM subquery) a
GROUP BY group_id
```