O SQL Server 2012 introduziu as poderosas funções analíticas LEAD() e LAG(), que permitem acessar dados de uma linha subsequente ou anterior em um conjunto de resultados. No entanto, e se você estiver trabalhando com uma versão mais antiga do SQL Server ou simplesmente quiser desafiar-se encontrando maneiras alternativas de obter os mesmos resultados?
Em um post anterior do blog, apresentamos um quebra-cabeça onde pedimos aos leitores que simulassem a funcionalidade do LEAD() e LAG() sem usar as funções analíticas incorporadas. Recebemos inúmeras soluções válidas e inovadoras, demonstrando a criatividade e habilidades de resolução de problemas de nossos leitores.
Uma das soluções vencedoras, fornecida por Geri Reshef, utilizou um autojoin e usou de forma inteligente o operador módulo para determinar os valores de lead e lag. Outra solução vencedora, de DHall, usou uma combinação de autojoins e subconsultas correlacionadas para obter os resultados desejados.
Vamos dar uma olhada mais de perto em uma das soluções vencedoras:
WITH T1 AS (
SELECT
Row_Number () OVER ( ORDER BY SalesOrderDetailID ) N ,
s.SalesOrderID ,
s.SalesOrderDetailID ,
s.OrderQty
FROM
Sales.SalesOrderDetail s
WHERE
SalesOrderID IN ( 43670 , 43669 , 43667 , 43663 )
)
SELECT
SalesOrderID ,
SalesOrderDetailID ,
OrderQty ,
CASE
WHEN N % 2 = 1 THEN MAX ( CASE WHEN N % 2 = 0 THEN SalesOrderDetailID END ) OVER ( Partition BY ( N + 1 )/ 2 )
ELSE MAX ( CASE WHEN N % 2 = 1 THEN SalesOrderDetailID END ) OVER ( Partition BY N / 2 )
END LeadVal ,
CASE
WHEN N % 2 = 1 THEN MAX ( CASE WHEN N % 2 = 0 THEN SalesOrderDetailID END ) OVER ( Partition BY N / 2 )
ELSE MAX ( CASE WHEN N % 2 = 1 THEN SalesOrderDetailID END ) OVER ( Partition BY ( N + 1 )/ 2 )
END LagVal
FROM
T1
ORDER BY
SalesOrderID ,
SalesOrderDetailID ,
OrderQty ;
Esta solução usa uma expressão de tabela comum (CTE) para gerar um número de linha para cada linha no conjunto de resultados. Em seguida, usa o operador módulo para determinar se o número da linha é ímpar ou par e, com base nisso, calcula os valores de lead e lag usando a função MAX() e lógica condicional.
Outras soluções vencedoras utilizaram técnicas diferentes, como o uso de subconsultas correlacionadas ou autojoins adicionais com valores de deslocamento. Cada solução demonstrou a versatilidade do SQL Server e as várias maneiras de obter os resultados desejados.
Ao explorar essas abordagens alternativas, você pode aprofundar sua compreensão do SQL Server e aprimorar suas habilidades de resolução de problemas. É importante lembrar que, embora as funções LEAD() e LAG() forneçam uma maneira conveniente de acessar dados de linhas adjacentes, sempre existem métodos alternativos disponíveis.
Fique ligado para mais quebra-cabeças e desafios do SQL Server, e continue aprimorando suas habilidades em SQL!