> 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.

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to