Re: Lowest 2 items per - Mailing list pgsql-sql
From | Oliveiros d'Azevedo Cristina |
---|---|
Subject | Re: Lowest 2 items per |
Date | |
Msg-id | 112ECE6EE7E74DE28DDDB057DB75870C@marktestcr.marktest.pt Whole thread Raw |
In response to | Lowest 2 items per ("Relyea, Mike" <Mike.Relyea@xerox.com>) |
Responses |
Re: Lowest 2 items per
|
List | pgsql-sql |
Sorry, Mike, previous query was flawed. This is (hopefully) the correct version Best, Oliver SELECT make, model, color,type, subquery1.cpp, min(cost/yield) as cpp2(SELECT printers.make, printers.model, consumables.color,consumables.type,min(cost/yield) AS cppFROM printersJOIN printersandconsumables ON printers.printerid =printersandconsumables.printeridJOINconsumables ON consumables.consumableid =printersandconsumables.consumableidWHERE consumables.costIs Not NullAND consumables.yield Is Not NullGROUP BY printers.make, printers.model, consumables.color,consumables.type)subquery1JOIN(SELECT printers.make, printers.model, consumables.color,consumables.type,cost,yieldFROMprintersJOIN printersandconsumables ON printers.printerid =printersandconsumables.printeridJOINconsumables ON consumables.consumableid =printersandconsumables.consumableidWHERE consumables.costIs Not NullAND consumables.yield Is Not Null) subquery2 ON (subquery1.make = subquery2.make AND subquery1.model = subquery2.model AND subquery1.color = subquery2.color AND subquery1.type = subquery2.type)WHERE subquery2.cost / subquery2.yield <> subquery1.cppGROUP BY subquery2.make,subquery2.model, subquery2.color,subquery2.type,subquery1.cppORDER BY make, model; ----- Original Message ----- From: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt> To: "Relyea, Mike" <Mike.Relyea@xerox.com>; <pgsql-sql@postgresql.org> Sent: Friday, June 01, 2012 3:56 PM Subject: Re: [SQL] Lowest 2 items per > Hi, Mike, > > Can you tell me if this gives what you want, and if it doesn't, what is > the error reported, or wrong result ? > > This is untested query, so Im not sure about it. > > Best, > Oliver > > SELECT make, model, color,type, subquery1.cpp, min(cost/yield) as cpp2 > ( > 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 > ) subquery1 > NATURAL JOIN > ( > SELECT printers.make, printers.model, consumables.color, > consumables.type > 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 > ) subquery2 > WHERE subquery2.cost / subquery2.yield <> subquery1.cpp > GROUP BY make, model, color,type > ORDER BY make, model; > > > ----- Original Message ----- > From: "Relyea, Mike" <Mike.Relyea@xerox.com> > To: <pgsql-sql@postgresql.org> > Sent: Friday, June 01, 2012 3:34 PM > Subject: [SQL] Lowest 2 items per > > > 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 > > -- > Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-sql