Re: N-tile function in postgres

From: François Beausoleil <francois(at)teksol(dot)info>
To: Rachel Owsley <Rachel(dot)Owsley(at)edointeractive(dot)com>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: N-tile function in postgres
Date: 2012-09-24 17:57:16
Message-ID: ABFEB810-FCC1-44EB-895E-0AB23F5A440E@teksol.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


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

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Rachel Owsley 2012-09-24 18:12:04 Re: N-tile function in postgres
Previous Message Rachel Owsley 2012-09-24 16:32:25 N-tile function in postgres