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

Simplificar query existente para mostrar última programación de etapa

Estas en el tema de Simplificar query existente para mostrar última programación de etapa en el foro de SQL Server en Foros del Web. Buenas tardes, Tengo una tabla "programacionEtapas" que está formada tal que: | id | etapa | fechaIni | fechaFin | createdOn | de forma que ...
  #1 (permalink)  
Antiguo 20/06/2013, 09:17
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 11 años, 2 meses
Puntos: 0
Simplificar query existente para mostrar última programación de etapa

Buenas tardes,

Tengo una tabla "programacionEtapas" que está formada tal que:

| id | etapa | fechaIni | fechaFin | createdOn |

de forma que cuando se reprograma una etapa, simplemente añado un nuevo registro, para guardar el histórico de reprogramaciones.

Luego, tengo una vista creada que muestra la fecha de inicio y fin de cada etapa, teniendo en cuenta la última programación (la actual) que se ha añadido para esa etapa, basándome en la mayor fecha del campo "createdOn".

Me da a mi que se puede simplificar bastante esta query, pero no acabo de dar con la fórmula para hacerlo.

Alguien me puede echar una mano?

Muchas gracias.
Saludos.
Código SQL:
Ver original
  1. SELECT     TOP 100 PERCENT pro.etapa, pro.fechaIni, pro.fechaFin
  2. FROM         dbo.ProgramacionEtapas AS pro INNER JOIN
  3.            (SELECT     p.id FROM dbo.ProgramacionEtapas AS p INNER JOIN
  4.                  (SELECT     TOP 100 PERCENT etapa, MAX(createdOn) AS createdOn
  5.                  FROM          dbo.ProgramacionEtapas
  6.                  GROUP BY etapa) AS s
  7.            ON p.etapa = s.etapa AND p.createdOn = s.createdOn GROUP BY p.id)
  8.            AS pre ON pro.id = pre.id

Última edición por gnzsoloyo; 20/06/2013 a las 10:37
  #2 (permalink)  
Antiguo 20/06/2013, 09:23
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 12 años, 10 meses
Puntos: 180
Respuesta: Simplificar query existente para mostrar última programación de etapa

Para quitarte de problemas, cuando haya una reprogramacion, la fecha createdOn ponla en NULL y en tu select, las eliminas o descartas
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 20/06/2013, 09:54
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Simplificar query existente para mostrar última programación de etapa

Hola iislas, gracias por contestar, pero me interesa guardar el dato por temas de históricos. Para saber en qué momento se reprogramó una etapa.
  #4 (permalink)  
Antiguo 20/06/2013, 11:06
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 12 años, 10 meses
Puntos: 180
Respuesta: Simplificar query existente para mostrar última programación de etapa

Entonces, agregale una columna de tipo BIT, 0-ausente, 1-presente, SIMPLE....
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 21/06/2013, 03:33
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Simplificar query existente para mostrar última programación de etapa

No se os ocurre alguna forma de hacerlo con los datos existentes? Actualmente tengo algo que funciona y no querría complicar la lógica del programa.

Estoy casi convencido de que se debería poder simplificar, me parece muy enrevesada la forma actual.

Gracias.
  #6 (permalink)  
Antiguo 21/06/2013, 06: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: 12 años, 6 meses
Puntos: 2656
Respuesta: Simplificar query existente para mostrar última programación de etapa

Cita:
No se os ocurre alguna forma de hacerlo con los datos existentes? Actualmente tengo algo que funciona y no querría complicar la lógica del programa.
SI un cambio estructural menor en la base te complica el programa, tienes un exceso de acoplamiento entre la capa de datos y la capa de negocio.
Cita:
Hola iislas, gracias por contestar, pero me interesa guardar el dato por temas de históricos. Para saber en qué momento se reprogramó una etapa.
Ese campo no te sirve, así como está, para ese fin, ya que sólo soportaría la existencia de una reprogramación, y no podría darte información histórica si hubiese más de una.
Por otro lado, el que lo pongas en NULL, no invalida tu lógica histórica, porque una etapa con ese campo en NULL es una etapa que jamás fue reprogramada, por lo que no veo el problema, y sí veo ventajas, como te lo plantea @iislas.
Cita:
No se os ocurre alguna forma de hacerlo con los datos existentes?
El tema es que si la estructura de datos que tienes (la estructura, y no los datos, son cosas diferentes), no es eficiente, o no está bien diseñada, ninguna consulta eficiente y efectiva sale completamente bien. Es difícil optimizar consultas basadas en estructuras inadecuadas.
Mi sugerencia sería que analices si es posible:
1) Separar la fecha de reprogramación a otra tabla (un dato opcional no es bueno que esté en una tabla base).
2) En caso de no poder hacerlo, veas de manejarlo como NULL, cuando no se ha cargado.
3) Desacopla la aplicación de la base. Demasiado acoplamiento genera siempre muchos problemas, entre otras cosas porque genera una dependencia bidireccional nociva.
Recuerdo que mis profesores (tanto de BBDD como de programación) siempre decían: "La aplicación debe poder cambiarse sin que la base de datos se entere, y la base de datos debe poder ser corregida sin que la aplicación deje de funcionar".
¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: query, select, sql, sql-sentencia
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 12:55.