pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: David Johnston <polobo@yahoo.com>
To: Relyea, Mike <Mike.Relyea@xerox.com>
Cc: " <pgsql-sql@postgresql.org>
Cc: " <pgsql-sql@postgresql.org>
Subject: Re: Lowest 2 items per
Date: Fri, 1 Jun 2012 11:13:27 -0400
Message-ID: <58DBEBA8-661B-4DB0-9E4C-734A65CBA9A3@yahoo.com> (raw)
In-Reply-To: <AF7D9319B29A0242A33C3BF843BD31330EFB8CCE@USA7061MS03.na.xerox.net>
References: <AF7D9319B29A0242A33C3BF843BD31330EFB8CCE@USA7061MS03.na.xerox.net>

On Jun 1, 2012, at 10:34, "Relyea, Mike" <Mike.Relyea@xerox.com> wrote:

> I need a little help putting together a query.  I have the tables listed
> below and I need to return the lowest two consumables (ranked by cost
> divided by yield) per printer, per color of consumable, per type of
> consumable.
> 
> CREATE TABLE printers
> (
>  printerid serial NOT NULL,
>  make text NOT NULL,
>  model text NOT NULL,
>  CONSTRAINT printers_pkey PRIMARY KEY (make , model ),
>  CONSTRAINT printers_printerid_key UNIQUE (printerid ),
> )
> 
> CREATE TABLE consumables
> (
>  consumableid serial NOT NULL,
>  brand text NOT NULL,
>  partnumber text NOT NULL,
>  color text NOT NULL,
>  type text NOT NULL,
>  yield integer,
>  cost double precision,
>  CONSTRAINT consumables_pkey PRIMARY KEY (brand , partnumber ),
>  CONSTRAINT consumables_consumableid_key UNIQUE (consumableid )
> )
> 
> CREATE TABLE printersandconsumables
> (
>  printerid integer NOT NULL,
>  consumableid integer NOT NULL,
>  CONSTRAINT printersandconsumables_pkey PRIMARY KEY (printerid ,
> consumableid ),
>  CONSTRAINT printersandconsumables_consumableid_fkey FOREIGN KEY
> (consumableid)
>      REFERENCES consumables (consumableid) MATCH SIMPLE
>      ON UPDATE CASCADE ON DELETE CASCADE,
>  CONSTRAINT printersandconsumables_printerid_fkey FOREIGN KEY
> (printerid)
>      REFERENCES printers (printerid) MATCH SIMPLE
>      ON UPDATE CASCADE ON DELETE CASCADE
> )
> 
> I've pulled together this query which gives me the lowest consumable per
> printer per color per type, but I need the lowest two not just the first
> lowest.
> 
> SELECT printers.make, printers.model, consumables.color,
> consumables.type, min(cost/yield) AS cpp
> FROM printers
> JOIN printersandconsumables ON printers.printerid =
> printersandconsumables.printerid
> JOIN consumables ON consumables.consumableid =
> printersandconsumables.consumableid 
> WHERE consumables.cost Is Not Null 
> AND consumables.yield Is Not Null
> GROUP BY printers.make, printers.model, consumables.color,
> consumables.type
> ORDER BY make, model;
> 
> 
> After doing a google search I didn't come up with anything that I was
> able to use so I'm asking you fine folks!
> 
> Mike
> 
> -- 
> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql


I would recommend using the "RANK" window function with an appropriate partition clause in a sub-query then in the outer query you simply WHERE rank <= 2

You will need to decide how to deal with ties.

David J.


view thread (15+ messages)  latest in thread

Message-ID: <58DBEBA8-661B-4DB0-9E4C-734A65CBA9A3@yahoo.com>
Permalink:  ../58DBEBA8-661B-4DB0-9E4C-734A65CBA9A3@yahoo.com/
Also on:    postgresql.org/message-id/58DBEBA8-661B-4DB0-9E4C-734A65CBA9A3@yahoo.com

 · 

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: polobo@yahoo.com, Mike.Relyea@xerox.com
  Subject: Re: Lowest 2 items per
  In-Reply-To: <58DBEBA8-661B-4DB0-9E4C-734A65CBA9A3@yahoo.com>

* 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