Indexando ou Enumerando tabela - SQL SERVER
- Amanda Nascimento
- 15 de set. de 2023
- 2 min de leitura
Atualizado: 19 de mar.
Indexar por data agrupando por uma coluna específica
Um desafio recorrente que vejo é ter apenas uma coluna de data como se fosse um registro, e ter demais registros de um mesmo id, linha a linha. Com isso, muitos os casos precisamos fazer alguns ajustes na tabela para poder fazer cálculos com as datas e gerar métricas.
Então, a primeira coisa que vou inserir na query é um indexador por data agrupando por uma coluna específica que no meu caso, irei utilizar a coluna chapa
ROW_NUMBER() OVER (PARTITION BY chapa ORDER BY data ASC) AS indexador,

Agora que consegui criar um indexador por chapa e em ordem crescente de datas, consigo visualizar na tabela acima que a chapa em questão teve apenas 3 registros.
Com a função LEAD() eu busco a data do próximo registro mantendo os mesmos critérios de data e por chapa, com isso, terei a data final. Neste exemplo, consigo agora calcular o tempo de cargo pois agora tenho uma data inicial e uma data final. Se for o último registro, utilizo getdate() que é a data de hoje do sistema e consigo fazer o cálculo com a data atual. O indexador é útil apenas para visualizarmos e validarmos os dados para fazer sentido. Podemos utilizar diretamente a função abaixo:
FORMAT(COALESCE(LEAD(data) OVER (PARTITION BY chapa ORDER BY data ASC), GETDATE()), 'dd/MM/yyyy') AS next_registro,

Desta forma consigo utilizar o datediff para calcular a diferença de dias entre a data inicial e final da nossa query para cada linha.
Enumerando uma coluna em ordem numérica
NEWID() para gerar uma ordem aleatória criada em uma nova coluna chamada Numero

SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Numero
FROM D_CALENDARIO
Enumerando através da coluna criada chamada Numero e ordenando a coluna dia

SELECT *, ROW_NUMBER() OVER (ORDER BY dia) AS Numero
FROM D_CALENDARIO
Enumerando através da coluna criada chamada Numero e ordenando em ordem descente pela coluna de data

SELECT *, ROW_NUMBER() OVER (ORDER BY DATA) AS Numero
FROM D_CALENDARIO