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

Reply via email to