sábado, 30 de mayo de 2020

AGRUPACIÓN DE VENTANA - Optimizar Registros


RETO:  Optimizar la tabla1, para reducir los registros al máximo, sin afectar la información.



          
   Tabla1

















Ej:
Los registros 1 y 2 se pueden simplificar en uno solo, ya que el producto y precio son el mismo, y las fechas pueden ser modificadas como: FechaInicial = 2020-01-01 y FechaFinal = 2020-02-29. De tal forma que no altera la información.
Ojo, el registro 9 no puede incluirse en el ejemplo porque el precio ya no es el mismo.

El resultado deseado sería así:





DECLARE @TblProductos AS TABLE
       (
 ClaveProducto           VARCHAR (10),
 NombreProducto          VARCHAR (10),
 Precio                  MONEY,
 FechaInicial            DATE,
 FechaFinal              DATE
           );

INSERT INTO @TblProductos VALUES
('SABRITAS'  , 'RUFLES'          , 12, '2020-01-01','2020-01-31'),
('SABRITAS'  , 'RUFLES'          , 12, '2020-02-01','2020-02-29'),
('BIMBO'     , 'MANTECADAS'      , 15, '2020-01-01','2020-03-31'),
('BIMBO'     , 'MANTECADAS'      , 15, '2020-04-01','2020-04-30'),
('LALA'      , 'CREMA'           , 13, '2020-01-01','2020-02-29'),
('LALA'      , 'CREMA'           , 13, '2020-03-01','2020-03-01'),
('LALA'      , 'CREMA'           , 12, '2020-03-02','2020-03-02'),
('LALA'      , 'CREMA'           , 12, '2020-03-05','2020-04-30'),
('LALA'      , 'CREMA'           , 13, '2020-05-01','2020-05-27'),
('SABRITAS'  , 'RUFLES'          , 14, '2020-03-01','2020-05-27'),
('SABRITAS'  , 'RUFLES'          , 14, '2020-05-28','2020-05-31'),
('SABRITAS'  , 'RUFLES'          , 14, '2020-06-02','2020-06-30'),
('SABRITAS'  , 'RUFLES'          , 14, '2020-07-01','2020-07-30'),
('SABRITAS'  , 'RUFLES'          , 14, '2020-08-01','2020-08-31');


WITH ValidaAgrupacion
AS
(
       SELECT *
                    ,Agrupar     = ROW_NUMBER () OVER (ORDER BY ClaveProducto, NombreProducto, FechaInicial) -  ROW_NUMBER () OVER (PARTITION BY ClaveProducto, NombreProducto, Precio ORDER BY ClaveProducto, NombreProducto, FechaInicial) +  DENSE_RANK () OVER(ORDER BY ClaveProducto, NombreProducto, Precio)
                   
       FROM   @TblProductos
),
 ValidaFechasConsecutivas
 AS
 (
 SELECT             *
                   
                    ,FechaConsecutiva = ISNULL (CASE
                                                    WHEN  DATEADD ( DAY, -1, LEAD (FechaInicial,1) OVER (PARTITION BY ClaveProducto, NombreProducto, Agrupar ORDER BY  ClaveProducto, NombreProducto, FechaInicial))  = FechaFinal THEN FechaFinal
                                         END , LAG (FechaFinal,1) OVER (PARTITION BY Agrupar order by FechaInicial))
 FROM        ValidaAgrupacion
 )
 SELECT             ClaveProducto
                    ,NombreProducto
                    ,Precio
                    ,FechaInicial = MIN (FechaInicial)
                    ,FechaFinal         = MAX (FechaFinal)
 FROM        ValidaFechasConsecutivas
 GROUP BY    ClaveProducto
                    ,NombreProducto
                    ,Precio
                    ,Agrupar
                    ,FechaConsecutiva
 ORDER BY    ClaveProducto, NombreProducto, FechaInicial


















No hay comentarios.:

Publicar un comentario