Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

no logro filtrar correctamente los campos

Estas en el tema de no logro filtrar correctamente los campos en el foro de Bases de Datos General en Foros del Web. Buenos días o tardes ya. Soy nuevo en este foro y es mi primer post. Tras un reciente cambio de trabajo me he visto obligado ...
  #1 (permalink)  
Antiguo 24/03/2011, 05:15
 
Fecha de Ingreso: marzo-2011
Ubicación: Cádiz
Mensajes: 7
Antigüedad: 13 años
Puntos: 0
no logro filtrar correctamente los campos

Buenos días o tardes ya. Soy nuevo en este foro y es mi primer post. Tras un reciente cambio de trabajo me he visto obligado a volver a tocar una BD(no hecha por mi) y no logro hacer la consulta requerida por mi supervisor. Llevo como 2 años sin hacer consultas y la verdad no consigo ver lo que quiero.

La tabla en cuestion es historial y tiene como campos codigo, usuario, fecha y tipo

En esa tabla se muestra si los usuarios están activos o no(por la variable tipo. Lo que tengo que hacer es:

Código SQL:
Ver original
  1. SELECT MAX(codigo) AS Cod,usuario,MAX(fecha) AS Fecha
  2. FROM historialusuario GROUP BY usuario ORDER BY usuario

Esto me devuelve el codigo secuencial de cada empleado, su codigo de usuario y la fecha en la que se dio de alta/baja. Hago el máximo porque se puede dar el caso de que en la misma fecha se de de alta y de baja a la vez a un usuario, y para saber la última inserción en la BD pues pillo el máximo de los codigos secuenciales asociados a ese usuario.

Pongo ejemplo de lo que muestra la tabla historialusuario y luego de la consulta mia.

historialusuario
codigo usuario fecha tipo
1 1 hoy A
2 1 hoy B
3 1 hoy A
4 1 hoy B
5 2 ayer A
6 2 hoy B


como podeis ver, al usuario 1 se le ha dado de alta y de baja hoy mismo varias veces. Lo que yo quiero como resultado es que me muestre:

codigo usuario fecha tipo
4 1 hoy B
6 2 hoy B

y con la consulta que puse arriba me lo muestra bien salvo la columna tipo que no se como unirla si mediante subconsulta, inner......

acepto sugerencias y/o algún ejemplo vendría bien :)

Saludos!
PD: si el hilo está colocado incorrectamente, muevanlo :)


RESUELTO:
por si alguien lo quiere
Código MySQL:
Ver original
  1. select codigo,usuario,fecha,tipo from historialusuario
  2. where (codigo,usuario,fecha ) = ( select max(codigo) as Cod,usuario,max(fecha) as Fecha
  3. from historialusuario as h where h.usuario=historialusuario.usuario  group by usuario)

Última edición por joepicha; 24/03/2011 a las 06:00
  #2 (permalink)  
Antiguo 24/03/2011, 06:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: no logro filtrar correctamente los campos

Demasiado complicado. Con la mitad de la consulta logras lo que buscas:

Código MySQL:
Ver original
  1.    MAX(codigo) Codigo,
  2.    usuario,
  3.    MAX(fecha) Fecha,
  4.    tipo
  5.    historialusuario
  6. GROUP BY usuario;
Esto debería tener el mismo resultado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/03/2011, 11:01
 
Fecha de Ingreso: marzo-2011
Ubicación: Cádiz
Mensajes: 7
Antigüedad: 13 años
Puntos: 0
Respuesta: no logro filtrar correctamente los campos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Demasiado complicado. Con la mitad de la consulta logras lo que buscas:

Código MySQL:
Ver original
  1.    MAX(codigo) Codigo,
  2.    usuario,
  3.    MAX(fecha) Fecha,
  4.    tipo
  5.    historialusuario
  6. GROUP BY usuario;
Esto debería tener el mismo resultado.
Pues no es lo mismo. Eso lanza un error de que la columna tipo no tiene función de agregación o tiene que estar en la clausula de group by ;)
  #4 (permalink)  
Antiguo 24/03/2011, 11:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: no logro filtrar correctamente los campos

Entonces no estás usando MySQL, como ponías en el ejemplo de tu resolución, porque en ese DBMS es posible hacer la consulta que te puse.
Asumí que si usabas la etiqueta de MySQL, es que estabas trabajando en MySQL

Es conveniente que siempre digas en qué DBMS estás trabajando, porque no todos tienen las mismas sintaxis, ni tampoco tienen las mismas funciones en ciertos casos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/03/2011, 14:39
 
Fecha de Ingreso: marzo-2011
Ubicación: Cádiz
Mensajes: 7
Antigüedad: 13 años
Puntos: 0
Respuesta: no logro filtrar correctamente los campos

Tienes razón, disculpa. Uso PostgreSQL y para poner Highlight no había PostgreSQL, pues puse el de MySQL.
  #6 (permalink)  
Antiguo 24/03/2011, 15:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: no logro filtrar correctamente los campos

Para futuras ocasiones, usa la etiqueta "SQL", esa es la genérica.
Probemos así:
Código SQL:
Ver original
  1. SELECT
  2.     T2.Codigo,
  3.     T2.usuario,
  4.     T2.Fecha,
  5.     T1.Tipo
  6. FROM
  7.     historialusuario  T1 INNER JOIN
  8.     (SELECT
  9.        MAX(codigo) Codigo,
  10.        usuario,
  11.        MAX(fecha) Fecha
  12.     FROM
  13.        historialusuario
  14.     GROUP BY usuario) T2 ON T1.Codigo = T2.Codigo;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/03/2011, 01:24
 
Fecha de Ingreso: marzo-2011
Ubicación: Cádiz
Mensajes: 7
Antigüedad: 13 años
Puntos: 0
Respuesta: no logro filtrar correctamente los campos

En este caso el inner join y el where que usé yo, para este caso concreto tendrían el mismo funcionamiento o aporta algo diferente, como rapidez y/o eficiencia. Porque no es lo mismo que lo que escupe la consulta sea de 5 filas que de 1500 filas.

Saludos!
  #8 (permalink)  
Antiguo 25/03/2011, 16:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: no logro filtrar correctamente los campos

Hay una gran diferencia de performance entre usar INNER JOIN y usar el WHERE. Te imaginas que si fuera la misma, el INNER JOIN no tendría razones para existir y ser la cláusula más usada.
Por empezar, el WHERE actúa recién sobre los registros obtenidos en el FROM, pero todos, lo que implica que se lee todo, incluso registros que son innecesarios. Esa lectura excesiva implica accesos a disco, bloques de memoria, swapping de disco, tiempo de proceso... .
En cambio, el filtrado de un INNER JOIN ocurre en el momento en que se leen los bloques de datos: se descarta lo que no cumpla la condición, por lo que el resultado de lectura (dependiendo de algunos factores) es forzosamente de menor uso de recursos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 26/03/2011, 04:27
 
Fecha de Ingreso: marzo-2011
Ubicación: Cádiz
Mensajes: 7
Antigüedad: 13 años
Puntos: 0
Respuesta: no logro filtrar correctamente los campos

Me ha quedado claro. Muchas gracias!

Se puede cerrar el hilo cuando guste ;)

Etiquetas: campos, correctamente, filtrar, bases-de-datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:44.