Hola a todos y gracias por la ayuda que me prestaron para resolver mis inquietudes.
Para resolver el problema me decidí tomar lo mejor de todo lo propuesto y hace lo siguiente: CREATE TABLE gps( id serial PRIMARY KEY, name varchar(10) NOT NULL UNIQUE, type integer, active boolean default 'f', FOREIGN KEY (type) REFERENCES type_gps(codigo) MATCH FULL on delete cascade on update cascade ); CREATE INDEX gps_name_index ON gps(name); -- Para las busquedas por nombre. CREATE TABLE positions_gps( id serial PRIMARY KEY, gps_id integer REFERENCES gps(id) MATCH FULL on delete cascade on update cascade, position point NOT NULL, velocidad real, altura real, grados real, satelites smallint, address varchar(100), fecha timestamp with time zone NOT NULL ); CREATE TABLE last_positions_gps( id integer NOT NULL UNIQUE, gps_id integer NOT NULL, position point NOT NULL, velocidad real, altura real, grados real, satelites smallint, address varchar(100), fecha timestamp with time zone NOT NULL, CONSTRAINT last_positions_gps_pkey PRIMARY KEY (gps_id) ); CREATE INDEX positions_gps_gpsidfecha_index ON positions_gps(gps_id, fecha); -- para realizar busquedas por fechas para un determinado gps. CREATE OR REPLACE FUNCTION ingresar_last_positions_gsp() RETURNS trigger AS $body$ DECLARE result boolean; BEGIN SELECT INTO result active FROM gps WHERE id=NEW.gps_id and active='t'; IF NOT FOUND THEN RETURN NULL; END IF; UPDATE last_positions_gps SET( id, position, velocidad, altura, grados, satelites, address, fecha) = ( NEW.id, NEW.position, NEW.velocidad, NEW.altura, NEW.grados, NEW.satelites, NEW.address, NEW.fecha) WHERE gps_id = NEW.gps_id and fecha < NEW.fecha; IF not found THEN INSERT INTO last_positions_gps VALUES (NEW.*); END IF; RETURN NEW; END; $body$ LANGUAGE plpgsql; CREATE TRIGGER ingresar_last_positions_gsp BEFORE INSERT ON positions_gps FOR EACH ROW EXECUTE PROCEDURE ingresar_last_positions_gsp(); Si tienen algún aporte estoy presto, gracias! Cordialmente, *Jorge Alonso Toro* Ing. Teleinformático. http://jolthgs.wordpress.com/ www.devmicrosystem.com -------------------------------------------------------------- Powered By Debian. Developer Bullix GNU/Linux. -------------------------------------------------------------- -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBIWWH6q7mzdgTzI5ARAkX5AJ9TR6hL2ocLMOUDRfhts8DlVl+jpwCeNw5x p4+4FNUHPDUx1lU9F8WSKCA= =zRhQ -----END PGP SIGNATURE----- Este correo esta protegido bajo los términos de la Licencia Atribución-Compartir Obras Derivadas Igual a 2.5 Colombia de Creative Commons. Observé la licencia visitando este sitio http://creativecommons.org/licenses/by-sa/2.5/co/. El 10 de julio de 2012 09:23, Javier Aquino <jaqu...@lexuseditores.com>escribió: > ** > Tienes razón Alvaro ... confundí lo rápido (velocidad) con lo fácil > (sentencia). > > Thanks por la observación ;-) > > Slds, > > Javier. > > > > On Mon, 2012-07-09 at 23:06 -0400, Alvaro Herrera wrote: > > Excerpts from Javier Aquino's message of lun jul 09 21:48:50 -0400 2012: > > OK, > > > > No había caído en cuenta de ello. > > > > Entonces te quedaría 2 opciones: > > > > 1. Crear un campo position_id en tu tabla "maestra" gps, este campo se > > actualizaría cada vez que realices un insert nuevo a tu tabla positions. > > > > Pros: > > - Actualización muy rápida ya que solo actualizas un campo int. > > Esto no es tal. Al hacer un UPDATE en Postgres, tiene que crearse una > versión completa nueva del registro, que es idéntica al anterior y sólo > difiere en el campo int que cambiaste. Así que no es para nada tan > rápido como sugieres. > > > 2. crear una tabla nueva exactamente igual a positions llamado > > last_positions, pero con dos cambios ( id integer y no serial, gps_id > > primary key) y este se actualizaría cada vez que ingrese un dato nuevo a > > tu tabla positions. > > Esta idea es mucho mejor. > > > BEGIN > > update last_positions > > set (id, gps_id, position, velocidad, altura, fecha, grados, > > satelites) = ( new.id, gps_id, new.position, new.velocidad, > > new.altura, new.fecha, new.grados, new.satelites) > > where gps_id = new.gps_id; > > if not found then > > insert into last_positions > > values ( new.* ); > > end if; > > Buena suerte consiguiendo que esto funcione bien cuando haya dos > procesos insertando registros nuevos para un mismo gps_id. > Creo que es más sano tomar un SELECT FOR UPDATE. > > > >