Le 2012-09-24 à 12:32, Rachel Owsley a écrit :
> Hi,
>
> Can anyone help me with an aggregate query I am having trouble with?
>
> I want to get the top 5 or top 10 most frequently shopped in merchant
> categories for each account holder at a bank and put each of the
> quintiles/deciles into separate columns. I would also like to put the average
> transaction amount for each of those top 5-10 categories into separate
> columns, and the date of the last transaction in each of those 5 to 10
> categories into separate columns. I am told that ntile may be an option for
> doing this, but can’t find any examples for using it in the documentation.
>
> We use Postgresql 9.1.
>
> Thank you so much for your help.
>
> Rachel
Hi!
Look at the tablefunc extension to do cross tabulation. The crosstab family of
functions turn a series of rows into columns. Something like this:
a | 1
b | 2
a | b
1 | 2
It obviously works with more columns. That would take care of the final part of
your query.
I've never used ntile() myself, but the docs say it returns 1 to the value.
Then you may want the min/max amount per decile to extract the values you want.
Something like this (untested, made up schema):
WITH raw_values(
SELECT
account_id
, merchant_category_id
, amount
FROM transactions
JOIN merchants USING (merchant_id))
, partitioned_sales AS (
SELECT
account_id
, merchant_category_id
, ntile(10) over (partition by account_id, merchant_category_id order by
amount) as "partition"
, min(amount) over (partition by account_id, merchant_category_id order by
amount) as amount
FROM raw_values)
SELECT *
FROM partitioned_sales
ORDER BY account_id, merchant_category_id, partition, amount
Hope that helps!
François