segunda-feira, 10 de fevereiro de 2020

Funções LAG e LEAD

Ola pessoal passando hoje aqui para falar um pouco sobre as funções LAG e LEAD

Essas funções pode ser muito bem aproveitas em variados relatórios, analise de Inconsistências em consultas analiticas e muitas outras...

LAG - Acessa os dados de uma linha anterior no mesmo conjunto de resultados sem usar uma autojunção começando com SQL Server 2012 (11.x). LAG fornece acesso a uma linha a um determinado deslocamento físico que antecede a linha atual. Use essa função analítica em uma instrução SELECT para comparar valores na linha atual com valores em uma linha anterior.

LEAD - Acessa os dados de uma linha seguinte no mesmo conjunto de resultados sem o uso de uma autojunção começando pelo SQL Server 2012 (11.x). LEAD fornece acesso a uma linha a um determinado deslocamento físico que segue a linha atual. Use essa função analítica em uma instrução SELECT para comparar valores na linha atual com valores em uma linha seguinte.

Mas Luiz, explica melhor esse negocio de LAG e LEAD ai, bom vamos la galera:

No exemplo abaixo tenho duas tabelas "TB_CLIENTE" ( Cadastro de Clientes ) e "TB_CONTATO" que vai armazenar o Historico de quantas vezes o cliente  recebeu uma ligação ou que a empresa ligou para esse cliente.

Observe a imagem abaixo, que na tabela "TB_CONTATO" ha 6 registros para o cliente Luiz
Descrição das colunas:
"Ordem Contato"-- Ordem do registro em que foi contactado ( usei um ROW_NUMBER()  da coluna do ID_CLIENTE ordenando pela Data Inicio do Contato
"Nome Cliente"-- Nome do Cliente ( Tabela Cliente )
"Data Hora Inico Contato"- Coluna DT_INICIO_CONTATO que representa o Horario de Inico do Contato desse registro
"Data Hora fim Contato"- Coluna DT_FIM_CONTATO que representa o Horario  Final do Contato desse registro
-- LAG  ( Circulado em Verde na imagem abaixo )
"Data Hora Inico Contato ( Anterior )"- Coluna DT_INICIO_CONTATO porem usando a função LAG para retornar a Data Hora Inicio do Contato do registro Anterior ( Note que caso o registro "Data Hora Inico Contato" seja o primeiro contato com o cliente essa coluna vai retornar NULL )
"Data Hora fim Contato ( Anterior )"- Coluna DT_FIM_CONTATO porem usando a função LAG para retornar a Data Hora Final do Contato do registro Anterior
-- LEAD  ( Circulado em Azul na imagem abaixo )
"Data Hora Inico Contato ( Proximo )"- Coluna DT_INICIO_CONTATO porem usando a função LEAD para retornar a Data Hora Inicio do Contato do proximo registro de contato com o cliente( Note que caso esse "Data Hora Inico Contato" seja o ultimo contato com o cliente essa coluna vai retornar NULL )
"Data Hora fim Contato ( Proximo )"- Coluna DT_FIM_CONTATO porem usando a função LEAD para retornar a Data Hora Final do Contato do proximo registro de contato com o cliente



Script utilizado nessa demo:

--DROP TABLE TB_CLIENTE

CREATE TABLE TB_CLIENTE (
 ID_CLIENTE INT IDENTITY(1,1) PRIMARY KEY,
 NM_CLIENTE VARCHAR(80)
)

--DROP TABLE TB_CONTATO

CREATE TABLE TB_CONTATO (
 ID_CONTATO INT IDENTITY PRIMARY KEY,
 DT_INICIO_CONTATO DATETIME,
 DT_FIM_CONTATO DATETIME,
 ID_CLIENTE INT
)
TRUNCATE TABLE TB_CLIENTE

INSERT INTO TB_CLIENTE ( NM_CLIENTE ) VALUES ('LUIZ FERNANDO')


INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200130 10:59:59','20200130 11:03:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200130 14:10:00','20200130 14:14:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200201 09:05:03','20200201 09:06:30',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200202 13:11:03','20200202 13:17:50',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200203 10:01:11','20200203 10:04:31',1)
INSERT INTO TB_CONTATO ( DT_INICIO_CONTATO,DT_FIM_CONTATO,ID_CLIENTE) VALUES ('20200203 19:07:31','20200203 19:10:25',1)

SET DATEFORMAT DMY

SELECT
 ROW_NUMBER() OVER(PARTITION BY CO.ID_CLIENTE ORDER BY CO.DT_INICIO_CONTATO ASC) AS "Ordem Contato",

 C.NM_CLIENTE AS "Nome Cliente",
 CO.DT_INICIO_CONTATO  AS "Data Hora Inico Contato",
 CO.DT_FIM_CONTATO   AS "Data Hora fim Contato",


 LAG(CO.DT_INICIO_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora Inico Contato ( Anterior )",
 LAG(CO.DT_FIM_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora fim Contato ( Anterior )",

 LEAD (CO.DT_INICIO_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora Inico Contato ( Proximo )",
 LEAD (CO.DT_FIM_CONTATO) OVER (ORDER BY CO.ID_CLIENTE)  AS "Data Hora fim Contato ( Proximo )"

FROM TB_CLIENTE C
JOIN TB_CONTATO CO ON C.ID_CLIENTE = CO.ID_CLIENTE






#FicaDica
Deus lhe ajuda a carregar os fardos que são pesados demais para você. Ele está com você para lhe sustentar e fortalecer. Entregue seus problemas a Deus e ele vai lhe ajudar



Nenhum comentário:

Postar um comentário

Migrando Blog https://luizflsilva.wordpress.com/

Curtindo cada vez mais a criar conteudo que possa levar aprendizado a amantes e profissionais da area de banco de dados, estou migrando o bl...