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