Thread: select best price

select best price

From
Gary Stainburn
Date:
Hi folks

I've got a table holding item code(cs_id), supplier a/c (co_id) , and 
price (cs_price).

How can I select the rows containing the lowest price for each item 
code?

I've tried various forms of min() etc and know it must be simple but I'm 
stumped.

Gary
-- 
Gary Stainburn
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000     



Re: select best price

From
Gary Stainburn
Date:
On Wednesday 26 October 2005 4:21 pm, Gary Stainburn wrote:
> Hi folks
>
> I've got a table holding item code(cs_id), supplier a/c (co_id) , and
> price (cs_price).
>
> How can I select the rows containing the lowest price for each item
> code?
>
> I've tried various forms of min() etc and know it must be simple but
> I'm stumped.
>
> Gary

I've come up with the select below.  Is there a better/more efficient 
way of doing this?

select cp.cs_id,  from cons_price_details cp,  (select cs_id, min(cs_price) as cs_price        from cons_price_details
     group by cs_id  ) v   where cp.cs_id = v.cs_id and cp.cs_price = v.cs_price;
 

-- 
Gary Stainburn
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000     



Re: select best price

From
Bruno Wolff III
Date:
On Wed, Oct 26, 2005 at 16:38:48 +0100, Gary Stainburn <gary.stainburn@ringways.co.uk> wrote:
> On Wednesday 26 October 2005 4:21 pm, Gary Stainburn wrote:
> > Hi folks
> >
> > I've got a table holding item code(cs_id), supplier a/c (co_id) , and
> > price (cs_price).
> >
> > How can I select the rows containing the lowest price for each item
> > code?
> >
> > I've tried various forms of min() etc and know it must be simple but
> > I'm stumped.
> >
> > Gary
> 
> I've come up with the select below.  Is there a better/more efficient 
> way of doing this?
> 
> select cp.cs_id,  from cons_price_details cp, 
>   (select cs_id, min(cs_price) as cs_price 
>         from cons_price_details 
>         group by cs_id
>    ) v 
>    where cp.cs_id = v.cs_id and cp.cs_price = v.cs_price;

If you only need one lowest price entry where there are ties, you could also
use DISTINCT ON (a nonstandard Postgres extension) and ORDER BY that may
execute faster.