> So I wonder - is there some kind of aggregate window function > what does desired results?
Not built in, but PostgreSQL makes it pretty easy to do so. With a little effort to define your own aggregate function, your query can look like this:
SELECT thing_id, category, int4range_list(period_id) FROM thing GROUP BY thing_id, category ORDER BY 1, 2;
I've attached a couple files -- one which creates the desired aggregate function, and the other loads a table with two of your sample data sets and runs the above. This is just intended as a quick example of the capabilities available to you.