Received: from localhost (maia-3.hub.org [200.46.204.184]) by postgresql.org (Postfix) with ESMTP id 311729FA1FE for ; Fri, 1 Dec 2006 10:48:17 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.184]) (amavisd-new, port 10024) with ESMTP id 76376-03 for ; Fri, 1 Dec 2006 10:47:59 -0400 (AST) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.4 Received: from web31801.mail.mud.yahoo.com (web31801.mail.mud.yahoo.com [68.142.207.64]) by postgresql.org (Postfix) with SMTP id 63C969FA173 for ; Fri, 1 Dec 2006 10:48:05 -0400 (AST) Received: (qmail 542 invoked by uid 60001); 1 Dec 2006 14:48:02 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=X-YMail-OSG:Received:Date:From:Subject:To:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-ID; b=WGLAAUrcmlo81zQd7O45flyHrKT1CWHbiqtWucOXIut5gc6V8HJdxhbAIhw3Ko/YCm5kA4lIYkS6LhEcLwua8HThSaHZyM2tw20lkoyZZXFQGDxLpoYkcDYWk8j6TWq2T2V+74qfKTPY+srM85xGv8VOpD0S5p9AZxkVJRAERtw=; X-YMail-OSG: gO2WmlkVM1lVnVeFKC3zmqvuZLEntMqforjlRTg4J3kB0isXgXHoi7j1gL_E5mBnGCbaoDe3rXFHTbM66LbUSoe.NjDLb8cglD_jZAFKfk61H2Gm1Xv3bsca1BFpUSSosg2WBHpk1.8HtLA- Received: from [12.177.97.50] by web31801.mail.mud.yahoo.com via HTTP; Fri, 01 Dec 2006 06:48:02 PST Date: Fri, 1 Dec 2006 06:48:02 -0800 (PST) From: Richard Broersma Jr Subject: Re: Setting boolean column based on cumulative integer value To: Markus Juenemann , pgsql-sql@postgresql.org In-Reply-To: <9d8bdcf30612010550o3a5721lefc366e4984fd145@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Message-ID: <847705.487.qm@web31801.mail.mud.yahoo.com> X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200612/7 X-Sequence-Number: 26963 > CREATE TABLE passenger_queue ( > id serial NOT NULL, > name character varying(40) NOT NULL, > weight integer NOT NULL, > gets_seat boolean default false > ) > > insert into passenger_queue values (1,"Peter",75,false) > insert into passenger_queue values (2,"Mary",50,false) > insert into passenger_queue values (3,"John",70,false) > insert into passenger_queue values (4,"Steve",80,false) > > According to the specifications given above Peter, Mary and John would > have 'gets_seat' > set to true because their cumulative weight is 195kg while Steve misses out. > > The big question is: How can I do this in a nice SQL query??? Well there are two ways that I can think of: The first option is probably the best. But the second is a good mental exercise. 1) a trigger that checks to insure that a new record doesn't exceed your max. 2) instead of inserting passenger weight you could insert begin/end weight range for each passenger. i.e.: CREATE TABLE passenger_queue ( id serial NOT NULL, name character varying(40) NOT NULL, plane_start_weight integer NOT NULL, plane_end_weight integer not null, constraint plane_max_wieght check( plane_end_weight <= 200 ), constraint sanity_check check( plane_end_weight > plane_start_weight) ) insert into passenger_queue values (1,"Peter", (select max(end_weight) from passenger_queue), (select max(end_weight) from passenger_queue) + 75); insert into passenger_queue values (2,"Mary", (select max(end_weight) from passenger_queue), (select max(end_weight) from passenger_queue) + 50); insert into passenger_queue values (3,"John", (select max(end_weight) from passenger_queue), (select max(end_weight) from passenger_queue) + 70); insert into passenger_queue values (4,"Steve", (select max(end_weight) from passenger_queue), (select max(end_weight) from passenger_queue) + 80); once you try to insert a record that exceeds your max weight the insert will fail. ofcourse if you have to delete a passenger record because he/she wishes to get off early you will need to have an additional update statement to shift down higher valued records insure that the range does not have any gaps. Regards, Richard Broersma Jr.