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


















jueves, 28 de mayo de 2020

CREATE TRIGGER ON ALL SERVER FOR LOGON


USE DW;
GO
-- ===============================================================================
-- Autor:                 MANUEL OMAR OLGUÍN HERNÁNDEZ
-- Fecha:                 2020 MAYO 28
-- Versión:               1.0
-- Requerimiento:         TRIGGER LOGON
--                        A NIVEL SERVIDOR
-- Descripcion:           NO PERMITE MÁS DE 10 CONEXIONES AL MISMO TIEMPO
-- =============================================================================




DROP TRIGGER connection_limit_trigger  ON  ALL SERVER
go
CREATE TRIGGER connection_limit_trigger 
ON ALL SERVER
FOR LOGON 
AS 
BEGIN 
      
       DECLARE @IdSession  SMALLINT;
       DECLARE @strSQL            NVARCHAR (50);

      
      
       IF  (
             SELECT COUNT(*)
             FROM   sys.dm_exec_sessions 
             WHERE  is_user_process = 1
             AND          login_name = ORIGINAL_LOGIN()
             ) > 10

             BEGIN

                    SET @IdSession = ( 
                                       SELECT TOP 1 Session_id
                                       FROM sys.dm_exec_sessions 
                                       WHERE is_user_process = 1
                                       AND login_name = ORIGINAL_LOGIN()
                                       ORDER BY login_time DESC
                                  );

                    SET @strSQL = N'KILL ' + CONVERT (VARCHAR(3), @IdSession)


                    EXEC (@strSQL)
             END

END;