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