I have a table trx
with following schema:
x
| id | p_id |
| 1 | 1 |
| 2 | 1 |
| 3 | 4 |
| 1000 | 2 |
where id
is the transaction id and p_id
the id of the person doing it.
I need to query trx
so I get a table that allows me to plot an histogram of frequencies of transactions, that means, I want to know how many p_id
did only 1 transaction, how many did 2, and so on. I have to aggregate 11 and more transactions in a +10
bin:
| n_trx | bin_size |
| 1 | 10 |
| 2 | 18 |
| 3 | 7 |
| +10 | 26 |
I know that I need the CASE
statement for the +10
thing, and I approached the task using two CTE
:
WITH new_trx_history
AS (WITH trx_history
AS (SELECT p_id,
Count(DISTINCT id) AS n_trx
FROM trx
GROUP BY p_id)
SELECT CASE
WHEN n_trx < 11 THEN n_trx
ELSE '+10'
END AS n_trx,
Count(*) AS bin_size
FROM trx_history
GROUP BY n_trx)
SELECT n_trx,
Sum(bin_size)
FROM new_trx_history
GROUP BY n_trx;
I would like to know if there is a way to have a more direct approach than my actual (working) query.
Here is the SQLFiddle
Advertisement
Answer
You can use CASE
in GROUP BY
WITH trx_history
AS (SELECT p_id,
Count(DISTINCT id) AS n_trx
FROM trx
GROUP BY p_id)
SELECT CASE
WHEN n_trx < 11 THEN n_trx
ELSE '+10'
END AS n_trx,
Count(*) AS bin_size
FROM trx_history
GROUP BY CASE
WHEN n_trx < 11 THEN n_trx
ELSE '+10'
END
;