GuilleSQL :: Microsoft SQL Server, SSIS, y más !! Votar en los Premios Bitacoras.com a Portal GuilleSQL

Como consultar la versión válida a una Fecha

Volver a: [Trabajar con tablas versionadas (Fecha Desde y Fecha Hasta) en SQL Server, Slowly Changing Dimension (SCD) Tipo 2]


Este capítulo describe cómo realizar una consulta SQL sobre una tabla versionada (con Fecha Desde y Fecha Hasta) para obtener la versión válida a un Fecha, algo muy habitual al trabajar con tablas versionadas (ej: obtener la versión válida de un Titular a fecha de Movimiento; obtener la versión válida de un Cliente a Fecha de Factura), tanto en entornos transaccionales (OLTP) como en entornos de Business Intelligence (BI) y Data Warehouse (DW) especialmente para Reporting. Se incluyen ejemplos de consultas SQL (en Transact-SQL), se explica la lógica de estas consultas SQL, se considera el caso de tablas versionadas que incluyan los campos Fecha Alta y Fecha Baja, etc.

Una de las operaciones más habituales (por no decir la operación más habitual) al trabajar con tablas versionadas (Fecha Desde y Fecha Hasta), es decir, con tablas que almacenan datos históricos, es consultar la versión válida a una fecha dada. Poniendo el ejemplo bancario de las Cuentas Corrientes y los Titulares, sería el caso de obtener la versión válida de un Titular específico a una fecha dada. Suponiendo una aplicación de facturación, este tipo de consultas se hace de vital importancia, ya que nos interesará conocer la información del Cliente a fecha de Factura (por poner uno de los muchos casos de uso).

Este tipo de consultas son muy habituales en sistemas operacionales o transaccionales (OLTP) en que se utilicen intensamente tablas versionadas. Sin embargo, en entornos de Business Intelligence (BI) y Data Warehouse (DW) también es necesario utilizar este tipo de consultas SQL cuando el origen de datos son tablas versionadas, resultando principalmente útil para entornos Reporting (en entornos OLAP quizás sea menos importante, ya que podemos utilizar Claves Subrogadas que ocultaremos en las tablas de dimensión, mostrando el nivel correspondiente a la Clave de Negocio). La diferencia en la problemática entre los entornos OLTP y Reporting, está en que en OLTP habitualmente accederemos a una única fila (posicionándonos en la fecha correcta, es decir, tomando la versión de la fecha), mientras que en Reporting suele tratarse más con consultas másivas (múltiples filas) posicionándose a una fecha también (ej: obtener la Cartera de Clientes a fecha de cierre del mes vencido).

Si no estuviésemos trabajando con tablas versionadas (ni con ningún otro sistema de histórico), para obtenerla la información de un Titular (si tomamos el ejemplo bancario de las Cuentas Corrientes y los Titulares), la consulta SQL se limitaría a una sencilla cláusula WHERE en la que filtrar por la Clave de Negocio (Business Key ó BK), como pudiera ser el código del Titular (ej: TitularId). A continuación se muestra un ejemplo de una consulta SQL:

SELECT *
FROM dbo.Titulares
WHERE TitularId = @TitularId

Sin embargo, al utilizar tablas versionadas (con Fecha Desde y Fecha Hasta), para cada Titular pueden existir múltiples filas, cada una de las cuales representa una versión distinta del mismo Titular, es decir, la información correspondiente a dicho Titular correspondiente al periodo comprendido entre la Fecha Desde y la Fecha Hasta de dicha fila. Por ello, siempre se suelen consultar las tablas versionadas a una fecha. La forma de construir la cláusula WHERE depende del Modelo de Versionado utilizado en la tabla que estamos consultando, lo cual determinará qué operadores de comparación utilizar, etc. Tomando como premisa la utilización del Modelo de Versionado presentado anteriormente en este Artículo, la consulta SQL a desarrollar para posicionarnos a un fecha en una tabla versionada, sería similar al siguiente ejemplo:

SELECT *
FROM dbo.Titulares
WHERE TitularId = @TitularId
   AND FecDesde <= @FechaConsulta
   AND FecHasta > @FechaConsulta

Insisto en que la utilización de los operadores de comparación correctos es fundamental. Por ejemplo, no podremos utilizar el operador BETWEEN (ej: @FechaConsulta BETWEEN FecDesde AND FecHasta), ya que es equivalente a FecDesde <= @FechaConsulta AND FecHasta >= @FechaConsulta, expresión que NO es válida para nuestra caso. Aquí, la elección incorrecta de operadores de comparación se paga muy caro, pues la consulta SQL no devolverá lo que tenía que devolver (malo ;-).

Para comprobar o validar nuestra consulta, podemos utilizar el Gráfico de Línea de Tiempo. Así, podemos tomar como Fecha de la Consulta una de las líneas rojas verticales discontinuas (ej: la primera de las líneas, la a), y seguidamente comprobar la consulta contra los diferentes casos de versiones, y en cada caso sustituir la Fecha Desde y Fecha Hasta (valores c y d) de la versión, y comprobar si se satisface correctamente o no nuestra consulta. Para simplificar este trabajo, podemos tomar la expresión lógica c<=a & d>a, y comprobar dicha expresión sobre el Gráfico de Línea de tiempo. El resultado es muy sencillo: sólo se debe satisfacer dicha expresión lógica (es decir, debe devolver Verdadero dicha expresión), para aquellas versiones válidas en la Fecha de la Consulta, y en el resto de los casos, la expresión no debe satisfacerse (es decir, debe devolver Falso).

Para complicar un poco más nuestra consulta, vamos a tomar como ejemplo una tabla versionada de Titulares que también incluye los campos Fecha Alta y Fecha Baja, de tal modo, que deseamos realizar una consulta SQL que devuelva la versión válida de un Titular en un momento del tiempo, sólo y exclusivamente si el Titular estaba dado de Alta en dicho momento del tiempo. En este caso, la consulta SQL que deseamos es similar a la anterior, pero deberemos fortalecer la cláusula WHERE (es decir, añadir una conjunción, osea, una cláusula AND) como se muestra en el siguiente ejemplo:

SELECT *
FROM dbo.Titulares
WHERE TitularId = @TitularId
   AND FecDesde <= @FechaConsulta
   AND FecHasta > @FechaConsulta
   AND FecAlta <= @FechaConsulta
   AND FecBaja > @FechaConsulta

Con esto, habremos conseguido nuestro objetivo, obteniendo la versión deseada, sólo y exclusivamente si dicha versión tenía vigencia a la fecha de consulta.

Volver a: [Trabajar con tablas versionadas (Fecha Desde y Fecha Hasta) en SQL Server, Slowly Changing Dimension (SCD) Tipo 2]




Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  623 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160



Archivo

Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.