Re: [pgsql-es-ayuda] Ayuda sobre consulta!!!!
Flavio: 2015-10-22 14:58 GMT+02:00 Flavio Roche: > Les escribo porque tengo la siguiente problemática, tengo una tabla persona > la cual cuenta con la siguiente estructura > CREATE TABLE persona > ( > pasaporte integer, > nombre text, > calificacion integer, > fecha text, > acumula boolean > ) > > Y pongo un ejemplo de los datos que tengo almacenados en la misma > > pasaportenombre calificacion fecha > acumula > 1 Pepe 4 12/10/2015 > t > 2 Jose 513/10/2015 > f > 1 Pepe 312/11/2015 > t > 3 Ramon 5 14/10/2015 > t > 2 Jose 313/11/2015 > f > Necesito hacer una funcion que se le pase por parámetro un rango de fecha, y > calcule la calificación promedio de las personas en ese intervalo de tiempo > en caso de que el parámetro acumula tenga valor true y en caso que no > acumule, la última calificación obtenida. Ejemplo de la salida deseada > al llamar ejecutar la funcion.. > Select * from consulta('01/10/2015','25/11/2015') > > 1 Pepe3.5 (acumula) > 2 Jose 3 (No acumula) > 3 Ramon 5 (Acumula) Aqui le veo un problema gordo, tu tabla parece estar desnormalizada y sin restricciones ( es decir, Jose podria tener pasaportes 2 y 22 , y pepe podria tener acumula t y f, y Ramon pasaporte y acumula a null. Esto hace que la funcion sea enormemente compleja. Para reducirlo un poco te comento sobre una estructura equivalente pero normalizada en dos tablas, persona ( pasaporte primary key, nombre not null, acumula not null) y calificaciones ( pasaport foreign key references persona, calificacion not null, fecha not null). Otro problema gordo es que metes FECHA como texto, malo, y encima en DD/MM/, peor ( los que venimos de la epoca de las tarjetas, y ademas seguimos usando archivos de texto plano, sabemos que las fechas es mejor guardarlas como numeros de 8 digitos o textos de 8 o 10 caracteres pero con la forma (A*100+M)*100+D o '/MM/DD' para que el sort natural del campo ordene por fecha automaticamente. Supondre tambien que puedes corregir eso. En ese caso con una funcion en cualquier lenguage no es dificil ( no hay mas que hacer dos select ordenados o con joins y barrer), incluso con las funciones de ventana creo que se podria hacer en un solo query. Para eso usas un truco tipico, que es empezar por calcular las dos cosas en la tabla de calificaciones, la media es facil, avg(calificacion*1.0), o avg(calificacion::real) ( otro problema en tu modelo de datos calificacion es integer pero la media la quieres con decimales ). el ultimo valor creo que se saca con last_value(calificacion) over (group by fecha, order by fecha), o algo asi, no tengo accesible donde probarlo en este momento pero no deberia ser dificil. Supongamos que tu query es: select pasaporte, avg(calificacion::real) as media, last_value(calificacion::real) over ( group by pasaporte order by fecha) as ultima from calificaciones group by pasaporte Ya solo tienes que hacer un join con personas para sacar las cosas. Con un CTE es facil: with aux as ( select pasaporte, avg(calificacion::real) as media, last_value(calificacion::real) over ( group by pasaporte order by fecha) as ultima from calificaciones group by pasaporte ) select per.pasaporte, per.name, case when per.acumula then media else ultima end, case when per.acumule then "(acumula)" else "(No acumula)" end from aux, personas per where aux.pasaporte = per.pasaporte order by pasaporte Esto seria mas o menos si normalizas las tablas y usas fechas. Si no puedes hacer algo similar con tu tabla original en varios pasos( usando CTE o select sobre select sobre select), empieza por seleccionar un to_date del fecha, para tener los ordenes correctos. Sobre este resultado haz el equivalente al primer query, pero añade los valores de nombre y pasaporte ( usa max(nombre), max(pasaporte), p.e., ya que es un query agregado, sobre este ultimo haz el case para formatear / seleccionar. Una vez que los tengas todos puedes simplificarlo a un unico query, pero te saldra complicado. Francisco Olarte. - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda
Re: [pgsql-es-ayuda] Ayuda sobre consulta!!!!
Saludos a todos los colegas de la comunidad Les escribo porque tengo la siguiente problemática, tengo una tabla persona la cual cuenta con la siguiente estructura Tabla Persona CREATE TABLE persona ( pasaporte integer, nombre text, calificacion integer, fecha text, acumula boolean ) Y pongo un ejemplo de los datos que tengo almacenados en la misma pasaporte nombre calificacion fecha acumula 1 Pepe 4 12/10/2015 t 2 Jose 5 13/10/2015 f 1 Pepe 3 12/11/2015 t 3 Ramon 5 14/10/2015 t 2 Jose 3 13/11/2015 f Necesito hacer una funcion que se le pase por parámetro un rango de fecha, y calcule la calificación promedio de las personas en ese intervalo de tiempo en caso de que el parámetro acumula tenga valor true y en caso que no acumule, la última calificación obtenida. Ejemplo de la salida deseada al llamar ejecutar la funcion.. Select * from consulta('01/10/2015','25/11/2015') 1 Pepe 3.5 (acumula) 2 Jose 3 (No acumula) 3 Ramon 5 (Acumula) Saludos... 17 de octubre: Final Cubana 2015 del Concurso de Programación ACM-ICPC. http://coj.uci.cu/contest/contestview.xhtml?cid=1407
Re: [pgsql-es-ayuda] Ayuda sobre consulta SQL
Disculpas escribí mal, se quiere saber los que no están en la tabla 2, el join me saca los que coinciden con la tabla 2 El 19 de marzo de 2015, 12:20, Gilberto Castillo gilberto.casti...@etecsa.cu escribió: Buenos días lista les escribo esperando me puedan dar algunos tips para poder solucionar la siguiente consulta, tengo dos tablas donde tengo campos de textos tabla1 id nrodocumento 1 '1.2.3.4.5.6' 2'2.3.4.5.6.7' 3 '3.4.5.6.7.8' 4'6.7.8.9.0.1' tabla2 id nrodocumento 1'3.4.5.6.7.8' 2'0.1.2.3.4.5' 3'1.2.3.4.5.6' Se quiere saber que documentos de la tabla 1 están en la tabla 2 con consulta sql, o necesariamente tengo que comparar en una funcion plpgsql? No tengo idea de lo que realmente quieres hacer, pero con un simple Join o usando Union, con ese campo como llave creo que resuelvas. Saludos, Gilberto Castillo La Habana, Cuba --- This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu Visit our web-site: http://www.kaspersky.com, http://www.viruslist.com
Re: [pgsql-es-ayuda] Ayuda sobre consulta SQL
Una forma posible select distinct tabla1.nrodocumento from tabla1 inner join tabla2 on tabla1.nrodocumento=tabla2.nrodocumento Guillermo Villanueva http://ar.linkedin.com/in/guillermovillanueva El 19 de marzo de 2015, 12:14, Linder Poclaba Lazaro linder...@gmail.com escribió: Buenos días lista les escribo esperando me puedan dar algunos tips para poder solucionar la siguiente consulta, tengo dos tablas donde tengo campos de textos tabla1 id nrodocumento 1 '1.2.3.4.5.6' 2'2.3.4.5.6.7' 3 '3.4.5.6.7.8' 4'6.7.8.9.0.1' tabla2 id nrodocumento 1'3.4.5.6.7.8' 2'0.1.2.3.4.5' 3'1.2.3.4.5.6' Se quiere saber que documentos de la tabla 1 están en la tabla 2 con consulta sql, o necesariamente tengo que comparar en una funcion plpgsql? Esperando su ayuda los saludo muy atentamente.
Re: [pgsql-es-ayuda] Ayuda sobre consulta SQL
Disculpas escribí mal, se quiere saber los que no están en la tabla 2, el join me saca los que coinciden con la tabla 2 Saca lo que tu pidas, haces la pregunta contraría y listo. Saludos, Gilberto Castillo La Habana, Cuba --- This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu Visit our web-site: http://www.kaspersky.com, http://www.viruslist.com - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
[pgsql-es-ayuda] Ayuda sobre consulta SQL
Buenos días lista les escribo esperando me puedan dar algunos tips para poder solucionar la siguiente consulta, tengo dos tablas donde tengo campos de textos tabla1 id nrodocumento 1 '1.2.3.4.5.6' 2'2.3.4.5.6.7' 3 '3.4.5.6.7.8' 4'6.7.8.9.0.1' tabla2 id nrodocumento 1'3.4.5.6.7.8' 2'0.1.2.3.4.5' 3'1.2.3.4.5.6' Se quiere saber que documentos de la tabla 1 están en la tabla 2 con consulta sql, o necesariamente tengo que comparar en una funcion plpgsql? Esperando su ayuda los saludo muy atentamente.
Re: [pgsql-es-ayuda] Ayuda sobre consulta SQL
Linder Poclaba Lazaro escribió: Buenos días lista les escribo esperando me puedan dar algunos tips para poder solucionar la siguiente consulta, tengo dos tablas donde tengo campos de textos tabla1 id nrodocumento 1 '1.2.3.4.5.6' 2'2.3.4.5.6.7' 3 '3.4.5.6.7.8' 4'6.7.8.9.0.1' tabla2 id nrodocumento 1'3.4.5.6.7.8' 2'0.1.2.3.4.5' 3'1.2.3.4.5.6' Se quiere saber que documentos de la tabla 1 están en la tabla 2 con consulta sql, o necesariamente tengo que comparar en una funcion plpgsql? select ... from tabla1 except select ... from tabla2 ? (Normalmente eso es lento. Mejor hacer un LEFT JOIN y pedir los que son NULL). -- Álvaro Herrerahttp://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training Services - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
Re: [MASSMAIL]Re: [pgsql-es-ayuda] Ayuda sobre consulta SQL
Y por qué no usar un LEFT JOIN para ello? Con éste podrías resolver el problema. On 19/03/15 12:20, Gilberto Castillo wrote: Buenos días lista les escribo esperando me puedan dar algunos tips para poder solucionar la siguiente consulta, tengo dos tablas donde tengo campos de textos tabla1 id nrodocumento 1 '1.2.3.4.5.6' 2'2.3.4.5.6.7' 3 '3.4.5.6.7.8' 4'6.7.8.9.0.1' tabla2 id nrodocumento 1'3.4.5.6.7.8' 2'0.1.2.3.4.5' 3'1.2.3.4.5.6' Se quiere saber que documentos de la tabla 1 están en la tabla 2 con consulta sql, o necesariamente tengo que comparar en una funcion plpgsql? No tengo idea de lo que realmente quieres hacer, pero con un simple Join o usando Union, con ese campo como llave creo que resuelvas. Saludos, Gilberto Castillo La Habana, Cuba --- This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu Visit our web-site: http://www.kaspersky.com, http://www.viruslist.com - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda
[pgsql-es-ayuda] Ayuda sobre consulta
Saludos Lista, Tengo las siguientes tablas: _TABLA_A _codigo doc _TABLA_B _codigo doc por eje: TABLA_A codigodoc 10 100 11 101 12 102 13 103 14 104 TABLA_B codigodoc 10 100 11 101 la tabla_b depende de la tabla_a para seleccionar los registros que no estan en la tabla_b, y si estan en la tabla_a, utilizo lo siguiente: SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) entonces, esto daria el resultado: codigodoc 12 102 13 103 14 104 Ahora, esta consulta ?se prodria realizar con algun join? Saludos
Re: [pgsql-es-ayuda] Ayuda sobre consulta
select a.* from tabla_a a left loin tabla_b b on a.codigo=b.codigo wehere b.codigo is null El día 31 de mayo de 2010 14:46, Desarrollo Escuintla desarrollo.escuin...@gmail.com escribió: Saludos Lista, Tengo las siguientes tablas: TABLA_A codigo doc TABLA_B codigo doc por eje: TABLA_A codigo doc 10 100 11 101 12 102 13 103 14 104 TABLA_B codigo doc 10 100 11 101 la tabla_b depende de la tabla_a para seleccionar los registros que no estan en la tabla_b, y si estan en la tabla_a, utilizo lo siguiente: SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) entonces, esto daria el resultado: codigo doc 12 102 13 103 14 104 Ahora, esta consulta ?se prodria realizar con algun join? Saludos - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
Re: [pgsql-es-ayuda] Ayuda sobre consulta
El 31 de mayo de 2010 12:46, Desarrollo Escuintla desarrollo.escuin...@gmail.com escribió: Saludos Lista, Tengo las siguientes tablas: *TABLA_A *codigo doc *TABLA_B *codigo doc por eje: TABLA_A codigodoc 10 100 11 101 12 102 13 103 14 104 TABLA_B codigodoc 10 100 11 101 la tabla_b depende de la tabla_a para seleccionar los registros que no estan en la tabla_b, y si estan en la tabla_a, utilizo lo siguiente: SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) entonces, esto daria el resultado: codigodoc 12 102 13 103 14 104 Ahora, esta consulta ?se prodria realizar con algun join? Si, por ejemplo: select * from otra_tabla inner join ( SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) ) as temp using ( codigo );
Re: [pgsql-es-ayuda] Ayuda sobre consulta
El día 31 de mayo de 2010 15:01, Julio Cesar Rodriguez Dominguez jura...@gmail.com escribió: El 31 de mayo de 2010 12:46, Desarrollo Escuintla desarrollo.escuin...@gmail.com escribió: Saludos Lista, Tengo las siguientes tablas: TABLA_A codigo doc TABLA_B codigo doc por eje: TABLA_A codigo doc 10 100 11 101 12 102 13 103 14 104 TABLA_B codigo doc 10 100 11 101 la tabla_b depende de la tabla_a para seleccionar los registros que no estan en la tabla_b, y si estan en la tabla_a, utilizo lo siguiente: SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) entonces, esto daria el resultado: codigo doc 12 102 13 103 14 104 Ahora, esta consulta ?se prodria realizar con algun join? Si, por ejemplo: select * from otra_tabla inner join ( SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) ) as temp using ( codigo ); Si, y despues haces un dump de la base y la llevas a otro servidor y despues reinstalas el SO y bajas la termica de tu casa. Creo que con eso haces lo que queres, mas que eso no se puede complicar. - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
Re: [pgsql-es-ayuda] Ayuda sobre consulta
El 31 de mayo de 2010 13:32, Agustin Ignacio Genoves agustingeno...@gmail.com escribió: El día 31 de mayo de 2010 15:01, Julio Cesar Rodriguez Dominguez jura...@gmail.com escribió: El 31 de mayo de 2010 12:46, Desarrollo Escuintla desarrollo.escuin...@gmail.com escribió: Saludos Lista, Tengo las siguientes tablas: TABLA_A codigo doc TABLA_B codigo doc por eje: TABLA_A codigodoc 10 100 11 101 12 102 13 103 14 104 TABLA_B codigodoc 10 100 11 101 la tabla_b depende de la tabla_a para seleccionar los registros que no estan en la tabla_b, y si estan en la tabla_a, utilizo lo siguiente: SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) entonces, esto daria el resultado: codigodoc 12 102 13 103 14 104 Ahora, esta consulta ?se prodria realizar con algun join? Si, por ejemplo: select * from otra_tabla inner join ( SELECT * FROM tabla_a WHERE CODIGO NOT IN (SELECT codigo FROM tabla_b;) ) as temp using ( codigo ); Si, y despues haces un dump de la base y la llevas a otro servidor y despues reinstalas el SO y bajas la termica de tu casa. Creo que con eso haces lo que queres, mas que eso no se puede complicar. ??. Cuál fué la intención de tanta palabrería?