Thread: the best way to get the topest 3 record in every group

the best way to get the topest 3 record in every group

From
"jack"
Date:
Hi,
There is a table like :
<<
itemNo
supplier
purchaseDate
Price
Qty
<<
Please provide an idea if I want to get the latest 3 puchase records for
each item and supplier. Thank you in advance.

jack



Re: the best way to get the topest 3 record in every group

From
dima
Date:
> There is a table like :
> <<
> itemNo
> supplier
> purchaseDate
> Price
> Qty
> <<
> Please provide an idea if I want to get the latest 3 puchase records for
> each item and supplier. Thank you in advance.
select * from table_name where supplier=value order by purchaseDate desc 
limit 3
???




Re: the best way to get the topest 3 record in every group

From
"jack"
Date:
Dima
My question is that I want to produce ALL the lastest 3 records for EACH
itemNo and supplier.

Jack
----- Original Message -----
From: "dima" <_pppp@mail.ru>
To: "jack" <datactrl@tpg.com.au>
Cc: <pgsql-sql@postgresql.org>
Sent: Monday, September 09, 2002 4:34 PM
Subject: Re: [SQL] the best way to get the topest 3 record in every group


> > There is a table like :
> > <<
> > itemNo
> > supplier
> > purchaseDate
> > Price
> > Qty
> > <<
> > Please provide an idea if I want to get the latest 3 puchase records for
> > each item and supplier. Thank you in advance.
> select * from table_name where supplier=value order by purchaseDate desc
> limit 3
> ???
>
>



Re: the best way to get the topest 3 record in every group

From
Viacheslav N Tararin
Date:
jack :

select * from purchase as p
where purchase_date >= ( select min(ppp.purchase_date)
                           from (select pp.purchase_date
                                   from purchase as pp
                                  where p.item_no = pp.item_no
                                    and p.supplier = pp.supplier
                                  order by 1 desc
                                  limit 3 ) as ppp );

But this query have leak, if more than three purchases at day. For avoid
this leak your need unique row identifier. In attachement  file with
test data and valid queries.

regards.

>Dima
>My question is that I want to produce ALL the lastest 3 records for EACH
>itemNo and supplier.
>
>Jack
>----- Original Message -----
>From: "dima" <_pppp@mail.ru>
>To: "jack" <datactrl@tpg.com.au>
>Cc: <pgsql-sql@postgresql.org>
>Sent: Monday, September 09, 2002 4:34 PM
>Subject: Re: [SQL] the best way to get the topest 3 record in every group
>
>
>
>
>>>There is a table like :
>>><<
>>>itemNo
>>>supplier
>>>purchaseDate
>>>Price
>>>Qty
>>><<
>>>Please provide an idea if I want to get the latest 3 puchase records for
>>>each item and supplier. Thank you in advance.
>>>
>>>
>>select * from table_name where supplier=value order by purchaseDate desc
>>limit 3
>>???
>>
>>
>>
>>
>
>
>---------------------------(end of broadcast)---------------------------
>TIP 6: Have you searched our list archives?
>
>http://archives.postgresql.org
>
>
>
>



Attachment

Re: the best way to get the topest 3 record in every group

From
Viacheslav N Tararin
Date:
jack :

select * from purchase as p
where purchase_date >= ( select min(ppp.purchase_date)                            from (select pp.purchase_date
                          from purchase as pp                                   where p.item_no = pp.item_no
                        and p.supplier = pp.supplier                                   order by 1 desc
                limit 3 ) as ppp );
 

But this query have leak, if more than three purchases at day. For avoid
this leak your need unique row identifier.
regards.
 >Dima >My question is that I want to produce ALL the lastest 3 records for EACH >itemNo and supplier. > >Jack >-----
OriginalMessage ----- >From: "dima" <_pppp@mail.ru> >To: "jack" <datactrl@tpg.com.au> >Cc: <pgsql-sql@postgresql.org>
>Sent:Monday, September 09, 2002 4:34 PM >Subject: Re: [SQL] the best way to get the topest 3 record in every group > >
>> >>>There is a table like : >>><< >>>itemNo >>>supplier >>>purchaseDate >>>Price >>>Qty >>><< >>>Please provide an
ideaif I want to get the latest 3 puchase 
 
records for >>>each item and supplier. Thank you in advance. >>> >>> >>select * from table_name where supplier=value
orderby purchaseDate desc >>limit 3 >>??? >> >> >> >> > > >---------------------------(end of
broadcast)--------------------------->TIP 6: Have you searched our list archives? > >http://archives.postgresql.org > >
>>
 







Re: the best way to get the topest 3 record in every group

From
Viacheslav N Tararin
Date:
jack :

select * from purchase as p
where purchase_date >= ( select min(ppp.purchase_date)
                            from (select pp.purchase_date
                                    from purchase as pp
                                   where p.item_no = pp.item_no
                                     and p.supplier = pp.supplier
                                   order by 1 desc
                                   limit 3 ) as ppp );

But this query have leak, if more than three purchases at day. For avoid
this leak your need unique row identifier. In attachement  file with
test data and valid queries.

regards.

 >Dima
 >My question is that I want to produce ALL the lastest 3 records for EACH
 >itemNo and supplier.
 >
 >Jack
 >----- Original Message -----
 >From: "dima" <_pppp@mail.ru>
 >To: "jack" <datactrl@tpg.com.au>
 >Cc: <pgsql-sql@postgresql.org>
 >Sent: Monday, September 09, 2002 4:34 PM
 >Subject: Re: [SQL] the best way to get the topest 3 record in every group
 >
 >
 >
 >
 >>>There is a table like :
 >>><<
 >>>itemNo
 >>>supplier
 >>>purchaseDate
 >>>Price
 >>>Qty
 >>><<
 >>>Please provide an idea if I want to get the latest 3 puchase records for
 >>>each item and supplier. Thank you in advance.
 >>>
 >>>
 >>select * from table_name where supplier=value order by purchaseDate desc
 >>limit 3
 >>???
 >>
 >>
 >>
 >>
 >
 >
 >---------------------------(end of broadcast)---------------------------
 >TIP 6: Have you searched our list archives?
 >
 >http://archives.postgresql.org
 >
 >
 >
 >




Attachment

Re: the best way to get the topest 3 record in every group

From
Masaru Sugawara
Date:
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