pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Masaru Sugawara <rk73@sea.plala.or.jp>
To: jack <datactrl@tpg.com.au>
Cc: pgsql-sql@postgresql.org
Subject: Re: the best way to get the topest 3 record in every group
Date: Tue, 10 Sep 2002 01:23:29 +0900
Message-ID: <20020910012302.828A.RK73@sea.plala.or.jp> (raw)
In-Reply-To: <000701c257d8$1163c9a0$1400a8c0@jac>
References: <3D7C4108.70407@mail.ru>
	<000701c257d8$1163c9a0$1400a8c0@jac>

On Mon, 9 Sep 2002 18:08:21 +1000
"jack" <datactrl@tpg.com.au> wrote:

> Dima
> My question is that I want to produce ALL the lastest 3 records for EACH
> itemNo and supplier.
> 
> Jack


I often use the next query for ranking, which is equivalent to Oracle's
PARTITION BY().  It isn't influenced by what kind of data your table has;
it only depends on the result of sorting


CREATE TEMP SEQUENCE seq_purchase;

SELECT t5.item_no, t5.supplier, t5.purchase_date,
                t5.price, t5.qty, t5.i - t3.n + 1 AS rank
FROM (SELECT t2.item_no, t2.supplier, min(t2.i) AS n 
        FROM (SELECT t1.*, nextval('seq_purchase') - 1 AS i
                 FROM (SELECT (SELECT setval('seq_purchase',1)), *
                      FROM purchase
                     ORDER BY item_no, supplier, purchase_date desc
                   ) AS t1
               LIMIT ALL
             ) AS t2
      GROUP BY t2.item_no, t2.supplier
     ) AS t3,
     (SELECT t4.*, nextval('seq_purchase') - 1 AS i
        FROM (SELECT (SELECT setval('seq_purchase',1)), *
                FROM purchase
             ORDER BY item_no, supplier, purchase_date DESC
             ) AS t4
        LIMIT ALL
     ) AS t5
WHERE t3.item_no = t5.item_no
  AND t3.supplier = t5.supplier
  AND t5.i - t3.n + 1 <= 3
;


Regards,
Masaru Sugawara





view thread (7+ messages)

Message-ID: <20020910012302.828A.RK73@sea.plala.or.jp>
Permalink:  ../20020910012302.828A.RK73@sea.plala.or.jp/
Also on:    postgresql.org/message-id/20020910012302.828A.RK73@sea.plala.or.jp

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: rk73@sea.plala.or.jp, datactrl@tpg.com.au
  Subject: Re: the best way to get the topest 3 record in every group
  In-Reply-To: <20020910012302.828A.RK73@sea.plala.or.jp>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox