I'm using PostgreSQL 9.1 and I have this data structure:
A B
-------
1 a
1 a
1 b
1 c
1 c
1 c
1 d
2 e
2 e
I need a query that produces this result:
1 4 {{c,3},{a,2},{b,1},{d,1}}
2 1 {{e,2}}
A=1, 4 rows total with A=1, the partial counts (3 rows with c value, 2 rows with a value, .....)
- The distinct values of column "A"
- The count of all rows related to the "A" value
- An array contains all the elements related to the "A" value and the relative count of itself
The sort needed for the array is based of the count of each group (like the example 3,2,1,1).
This is what you need:
Maybe I'm missing something, but this should do it:
This should do the trick:
Returns:
ct_total
: total count ofb
pera
.ct_distinct_b
: count of distinctb
pera
.b_arr
: array ofb
plus frequency ofb
, sorted by frequency ofb
.Ordered by total count of
b
pera
.Alternatively, you can use an
ORDER BY
clause within the aggregate call in PostgreSQL 9.0 or later. Like:May be clearer. But it's typically slower. And sorting rows in a subquery works for simple queries like this one. More explanation: