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

Seleccionar ultimo registro de un grupo con condicion

Estas en el tema de Seleccionar ultimo registro de un grupo con condicion en el foro de Bases de Datos General en Foros del Web. Buen día amigos, necesito su colaboración, no logro realizar una consulta y espero que me puedan ayudar. Tengo una tabla llamada registro, en ella almaceno ...
  #1 (permalink)  
Antiguo 31/03/2015, 12:17
 
Fecha de Ingreso: marzo-2015
Mensajes: 7
Antigüedad: 9 años, 1 mes
Puntos: 0
Pregunta Seleccionar ultimo registro de un grupo con condicion

Buen día amigos, necesito su colaboración, no logro realizar una consulta y espero que me puedan ayudar.

Tengo una tabla llamada registro, en ella almaceno los datos de personas que paguen un servicio mensualmente o semestralmente, deseo mostrar al usuario los que están próximos a expirar para que el pueda avisarles y que renueven el servicio y la estructura de la tabla es la siguiente:

Tabla registro:

idregistro
personas_documento
fecha_inicio
fecha_fin
tipo
valor


el id es un valor unico y es incremental, luego esta el documento de la persona, la fecha de inicio que es cuando pago por el servicio y la fecha final es el dia que vence esa suscripcion, el tipo es si es mensual o semestral y el valor es lo que pago por ese servicio.

Aqui viene mi problema

Resulta que he logrado mostrar los resgistros que se venceran dentro de 3 o menos dias teniendo encuenta la fecha actual de la siguiente manera:

Código SQL:
Ver original
  1. SELECT*FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3

el resultado son los registros en los que su fecha final sea menor o igual a 3 dias y mostrara al usuario esa informacion.

Ahora teniendo en cuenta esto, el usuario le comunicara a la persona y ella decidirá renovar su suscripción de manera que la fecha inicial será la fecha final y la nueva fecha final será dentro de uno o seis meses segun sea el caso.
El registro anterior seria el siguiente:

idregistro | personas_documento | fecha_inicio | fecha_fin | tipo | valor |
1 | 55555 | 2015-03-01| 2015-04-01 | Mensual | 30000|

El nuevo registro quedaría asi:

idregistro | personas_documento | fecha_inicio | fecha_fin | tipo | valor |
2 | 55555 | 2015-04-01| 2015-05-01 | Mensual | 30000|
De manera que tenemos dos registros de a misma persona, pero si realizo de nuevo la consulta:
Código SQL:
Ver original
  1. SELECT*FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3
Me mostrará que el registro va a expirar porque claramente cumple con la condicion del where el primer registro.
Lo que quiero es que al renovar la suscripción deje de mostrarme el registro anterior y me tome el registro mas nuevo, teniendo en cuanta que habrán muchas personas registradas en el sistema si hace esto ya no me mostrará que el registro va a expirar sino que está al día.
Algunas nociones que tengo son seleccionar el idregistro mayor de cada persona y realizar la condición pero no se como hacerlo porque no tengo idea realmente

Última edición por jleoalvarez; 31/03/2015 a las 12:23
  #2 (permalink)  
Antiguo 31/03/2015, 12:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Código SQL:
Ver original
  1. SELECT * FROM registro WHERE id IN (
  2.  
  3. SELECT MAX(id) FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3)

Algo como eso :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 31/03/2015, 12:52
 
Fecha de Ingreso: marzo-2015
Mensajes: 7
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. SELECT * FROM registro WHERE id IN (
  2.  
  3. SELECT MAX(id) FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3)

Algo como eso :)
Hola amigo gracias por tu respuesta, la probe y al parecer funciona pero solo me muestra un registro, mira tengo los siguientes datos ingresados:

2 | 1053332958 | 2015-03-01 | 2015-04-01 | Mensual | 30000

3 | 545454 | 2015-03-02 | 2015-04-02 | Mensual | 30000

4 | 545454 | 2015-04-02 | 2015-05-02 | Mensual | 30000

como puedes ver si realizo la consulta que me sugeriste me muestra solamente el registro N°3, cuando debería mostrar el n°2 solamente porque el n°4 renueva el registro 3.
Gracias amigo por tomarte el tiempo de leer y ayudar
  #4 (permalink)  
Antiguo 31/03/2015, 13:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Código SQL:
Ver original
  1. SELECT * FROM registro AS t1
  2. LEFT JOIN
  3.  (
  4. SELECT MAX(id) AS id, persona FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3 GROUP BY persona) AS t2 ON (t1.id=t2.id AND t1.persona=t2.persona)

Prueba con eso :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 31/03/2015, 14:18
 
Fecha de Ingreso: marzo-2015
Mensajes: 7
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. SELECT * FROM registro AS t1
  2. LEFT JOIN
  3.  (
  4. SELECT MAX(id) AS id, persona FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3 GROUP BY persona) AS t2 ON (t1.id=t2.id AND t1.persona=t2.persona)

Prueba con eso :)
Hola amigo, gracias por tu nuevo aporte de verdad que eres la unica persona que ha querido ayudar y eso es muy valioso para mi, pero te comento la situacion, ejecute la consulta tal cual y nada, este fue el resultado

+------------+--------------------+--------------+------------+---------+-------
+------+--------------------+
| idregistro | personas_documento | fecha_inicio | fecha_fin | tipo | valor
| id | personas_documento |
+------------+--------------------+--------------+------------+---------+-------
+------+--------------------+
| 2 | 1053332958 | 2015-03-01 | 2015-04-01 | Mensual | 30000
| 2 | 1053332958 |
| 3 | 545454 | 2015-03-02 | 2015-04-02 | Mensual | 30000
| 3 | 545454 |
| 4 | 545454 | 2015-04-02 | 2015-05-02 | Mensual | 30000
| NULL | NULL |
+------------+--------------------+--------------+------------+---------+-------
+------+--------------------+

No se que es todo eso, esperaba que por fin funcionara :(
  #6 (permalink)  
Antiguo 31/03/2015, 14:46
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, 5 meses
Puntos: 2658
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Cita:
Iniciado por jleoalvarez Ver Mensaje
Buen día amigos, necesito su colaboración, no logro realizar una consulta y espero que me puedan ayudar.

Tengo una tabla llamada registro, en ella almaceno los datos de personas que paguen un servicio mensualmente o semestralmente, deseo mostrar al usuario los que están próximos a expirar para que el pueda avisarles y que renueven el servicio y la estructura de la tabla es la siguiente:

Tabla registro:

idregistro
personas_documento
fecha_inicio
fecha_fin
tipo
valor


el id es un valor unico y es incremental, luego esta el documento de la persona, la fecha de inicio que es cuando pago por el servicio y la fecha final es el dia que vence esa suscripcion, el tipo es si es mensual o semestral y el valor es lo que pago por ese servicio.

Aqui viene mi problema

Resulta que he logrado mostrar los resgistros que se venceran dentro de 3 o menos dias teniendo encuenta la fecha actual de la siguiente manera:

Código SQL:
Ver original
  1. SELECT*FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3

el resultado son los registros en los que su fecha final sea menor o igual a 3 dias y mostrara al usuario esa informacion.

Ahora teniendo en cuenta esto, el usuario le comunicara a la persona y ella decidirá renovar su suscripción de manera que la fecha inicial será la fecha final y la nueva fecha final será dentro de uno o seis meses segun sea el caso.
El registro anterior seria el siguiente:

idregistro | personas_documento | fecha_inicio | fecha_fin | tipo | valor |
1 | 55555 | 2015-03-01| 2015-04-01 | Mensual | 30000|

El nuevo registro quedaría asi:

idregistro | personas_documento | fecha_inicio | fecha_fin | tipo | valor |
2 | 55555 | 2015-04-01| 2015-05-01 | Mensual | 30000|
De manera que tenemos dos registros de a misma persona, pero si realizo de nuevo la consulta:
Código SQL:
Ver original
  1. SELECT*FROM registro WHERE datediff(fecha_fin,variable_fecha_actua)<=3
Me mostrará que el registro va a expirar porque claramente cumple con la condicion del where el primer registro.
Lo que quiero es que al renovar la suscripción deje de mostrarme el registro anterior y me tome el registro mas nuevo, teniendo en cuanta que habrán muchas personas registradas en el sistema si hace esto ya no me mostrará que el registro va a expirar sino que está al día.
Algunas nociones que tengo son seleccionar el idregistro mayor de cada persona y realizar la condición pero no se como hacerlo porque no tengo idea realmente
Tu modelo de datos no permite la exclusión que buscas obtener. Necesita de un campo de estado o de baja para aquellso registros que ya han sido cancelados.
Lo usual en esos casos es agregar un campo de fecha de cancelación, que se determine como nulable (pueda contener nulos) por default. De ese modo ese campo sólo se lleanrá al cancelar o renovar, permitiendo una exclusión con condicion IS NOT NULL sobre ese campo.
__________________
¿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 02/04/2015, 11:34
 
Fecha de Ingreso: marzo-2015
Mensajes: 7
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Seleccionar ultimo registro de un grupo con condicion

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tu modelo de datos no permite la exclusión que buscas obtener. Necesita de un campo de estado o de baja para aquellso registros que ya han sido cancelados.
Lo usual en esos casos es agregar un campo de fecha de cancelación, que se determine como nulable (pueda contener nulos) por default. De ese modo ese campo sólo se lleanrá al cancelar o renovar, permitiendo una exclusión con condicion IS NOT NULL sobre ese campo.
Amigo, me has dado la luz que necesitaba, efectivamente eso era lo que buscaba y asi se facilitará la consulta, en este momento estoy modificando la base de datos con tu recomendación.
Muchisimas gracias a ti y al otro amigo de las respuestas anteriores por tomarse el tiempo de colaborar. Ahora podre hacerlo!

Etiquetas: mysql+consulta
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 16:11.