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

Obtener registro anterior según fecha actualización

Estas en el tema de Obtener registro anterior según fecha actualización en el foro de SQL Server en Foros del Web. Hola, quisiera ver si me pueden ayudar con esto, tengo 2 tablas: Una para guardar registros de documentos de proveedor (doc_prv): DOC_PRV - id_doc_prv , ...
  #1 (permalink)  
Antiguo 13/02/2012, 15:13
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 10 meses
Puntos: 2
Obtener registro anterior según fecha actualización

Hola, quisiera ver si me pueden ayudar con esto, tengo 2 tablas:

Una para guardar registros de documentos de proveedor (doc_prv):

DOC_PRV
- id_doc_prv , numeric(18,0) , pk, (vale hongo como pk)
- rut_prv , numeric(10,0) , (fk)
- cdg_doc_prv , varchar(50) -- un codigo que indica que tipo de doc es
- fol_doc_prv , varchar(50) -- el numero de folio del doc
- est_doc_prv , bit -- booleano según doc vigente o no vigente
- fec_upd_doc_prv , datetime -- la ultima fecha en que se actualizó ese doc

Y otra tabla de historico (hst_doc_prv) para cuando se cargue un registro en doc_prv el cual ya existe, el anterior pase al historial. Dicho de otro modo, sirve para mantener solo el doc mas actual en doc_prv y el anterior en hst_doc_prv, la estructura de hst_doc_prv es idéntica a doc_prv salvo por que tiene su propia llave, igual lo pongo:

HST_DOC_PRV
- id_hst_doc_prv , numeric(18,0) , pk
- id_doc_prv , numeric(18,0) , fk
- rut_prv , numeric(10,0) , (fk)
- cdg_doc_prv , varchar(50) -- un codigo que indica que tipo de doc es
- fol_doc_prv , varchar(50) -- el numero de folio del doc
- est_doc_prv , bit -- booleano según doc vigente o no vigente
- fec_upd_doc_prv , datetime -- la ultima fecha en que se actualizó ese doc

A su vez, en la practica acá a un doc lo identifican como único por (rut_prv, cdg_doc_prv y fol_doc_prv) para que lo tengan presente

Por otra parte, lo que no está funcionando en este sistema es la funcionalidad de "mantener solo el doc mas actual en doc_prv y el anterior en hst_doc_prv",, lo que sucede actualmente es que guarda N docs en doc_prv de un mismo documento (incluso los que deberían estar en el histórico) y N docs en hst_doc_prv también de un mismo documento (no me pregunten porque yo solo llegue hace poco acá).

Bien, mi pasos a seguir para arreglar esto son:
- Eliminar todos los registros de hst_doc_prv actuales (no problem estoy autorizado y ya lo hice)
- Crear una query para enviar cada "registro anterior" de cada documento en doc_prv hacia la tabla hst_doc_prv
- Eliminar los registros de doc_prv que esten no vigentes (est_doc_prv=0), esto es para mover los regsitros que ya fueron enviados al historico, pero es el punto anterior el que me tiene partiendome el mate.

por ejemplo tengo estos registros en doc_prv:

rut_prv, cdg_doc_prv, fol_doc_prv, fec_upd_doc_prv
3158355, 12, 39672, 0, 2011-06-07
3158355, 12, 39672, 0, 2011-06-07
3158355, 12, 39672, 0, 2011-06-12
3158355, 12, 39672, 1, 2011-06-14
4667112, 50, 40566, 0, 2010-01-12
...
...
etc

como ven, los 4 representan un mismo documento, pero ingresado en distintos momentos, y eso sucede con cada documento. Ya se como obtener el ultimo doc en ser ingresado mediante la función MAX(fecha) y haciendo un group by en esa tabla, pero lo que no se es como obtener el registro anterior, en el ejemplo me gustaría obtener mediante una query el que tiene por fecha de update 2011-06-12 y hacer eso con cada documento. Y eso considerando que en la práctica los docs se identifican por rut_prv, cdg_doc_prv, fol_doc_prv como mencioné anteriormente.

Espero haber sido claro sino me preguntan nomas, de antemano gracias y mis respetos.
  #2 (permalink)  
Antiguo 13/02/2012, 15:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Obtener registro anterior según fecha actualización

select * from tabla where fecha = (select max(fecha) from tabla where registro='reg')

Algo asi te sirve??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 13/02/2012, 15:31
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Obtener registro anterior según fecha actualización

Hola, gracias por la rapidez de tu respuesta, pero la verdad no me sirve , necesito del ultimo registro seleccionar el que esta antes de ese (en cuanto a fecha de update), saludos.
  #4 (permalink)  
Antiguo 13/02/2012, 15:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Obtener registro anterior según fecha actualización

Y no te serviria traer el maximo por fecha donde fol_doc_prv = 0????
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 13/02/2012, 16:02
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Obtener registro anterior según fecha actualización

y asi:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. dato datetime
  4. )
  5.  
  6. INSERT INTO #temp VALUES ('2011-06-07')
  7. INSERT INTO #temp VALUES ('2011-06-07')
  8. INSERT INTO #temp VALUES ('2011-06-12')
  9. INSERT INTO #temp VALUES ('2011-06-14')
  10. INSERT INTO #temp VALUES ('2010-01-12')
  11.  
  12.  
  13. SELECT * FROM(
  14. SELECT ROW_NUMBER() OVER(ORDER BY dato DESC) rn, dato FROM #temp
  15. ) AS t1 WHERE rn=2
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 13/02/2012, 16:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Obtener registro anterior según fecha actualización

Libras, ¿Como sabes cual es de ACTUALIZACION (UPDATE)?, yo estoy asumiendo que es porque la columna fol_doc_prv con un CERO te lo indica.
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 13/02/2012, 16:41
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Obtener registro anterior según fecha actualización

Cita:
Iniciado por iislas Ver Mensaje
Libras, ¿Como sabes cual es de ACTUALIZACION (UPDATE)?, yo estoy asumiendo que es porque la columna fol_doc_prv con un CERO te lo indica.
a bueno esa es otra cosa, yo lo unico que hice fue sacar la segunda fecha de la tabla jejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 13/02/2012, 21:28
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Obtener registro anterior según fecha actualización

Ahhhhh señores mis disculpas me equivoque en el ejemplo, ya me parecía raro la primera respuesta de iislas sobre fol_doc_prv = 0 aunque gracias por tu tiempo. Lo que pasa es que inicié el tema justo antes de salir del trabajo y por ahí me anduve apurando, en fin... en el ejemplo me falto la columna est_doc_prv (vigente o no), por eso los ceros parecían ser el folio, bueno esta es la tabla:

rut_prv, cdg_doc_prv, fol_doc_prv, est_doc_prv, fec_upd_doc_prv
______________________________________________
3158355, 12, 39672, 0, 2011-06-07
3158355, 12, 39672, 0, 2011-06-07
3158355, 12, 39672, 0, 2011-06-12
3158355, 12, 39672, 1, 2011-06-14
4667112, 50, 40566, 0, 2010-01-12
...
...
etc

El registro que necesito es el que esta en color azul, ya que el ultimo de ese documento es el que tiene fecha de update 2011-06-14 (el único que esta vigente) y como necesito el anterior registro para guardarlo en el historial e ahí mi cuestión.

Libras, ahora voy a analizar tu query, averiguo que hace el over que es primera vez que me lo topo, veo como lo aplico y si me sirve pongo la solución, gracias.

Mmmmmentira, primero voy a dormir un rato y mañana hago eso, por suerte tengo algo de holgura con este requerimiento jeje. buenas noches.
  #9 (permalink)  
Antiguo 14/02/2012, 05:58
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Obtener registro anterior según fecha actualización

Cita:
Iniciado por Libras Ver Mensaje
y asi:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. dato datetime
  4. )
  5.  
  6. INSERT INTO #temp VALUES ('2011-06-07')
  7. INSERT INTO #temp VALUES ('2011-06-07')
  8. INSERT INTO #temp VALUES ('2011-06-12')
  9. INSERT INTO #temp VALUES ('2011-06-14')
  10. INSERT INTO #temp VALUES ('2010-01-12')
  11.  
  12.  
  13. SELECT * FROM(
  14. SELECT ROW_NUMBER() OVER(ORDER BY dato DESC) rn, dato FROM #temp
  15. ) AS t1 WHERE rn=2
Esa es la manera gracias colega que tengas buen día
  #10 (permalink)  
Antiguo 14/02/2012, 06:18
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Obtener registro anterior según fecha actualización

Cita:
Iniciado por mariox55 Ver Mensaje
Esa es la manera gracias colega que tengas buen día
solo tuve que agregarle la parte de:

PARTITION BY nombre _campo

gracias, dejo la documentación de ROW_NUMBER()

http://msdn.microsoft.com/es-es/library/ms186734.aspx

Etiquetas: fecha, registro, tabla, anteriores
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 05:52.