Para ser breve, lendo o livro SQL Server 2012 High-Performance T-SQL Using Window Functions escrito pelo famoso Itzik Ben Gan, há uma parte no qual ele apresenta um novo tipo de solução que se implementado iria facilitar por demais a vida de um DBA.
O Problema
Supondo que temos a seguinte tabela e informações…
USE tempdb
go
CREATE TABLE Partitioning
(
IDEmpregado INT NOT NULL,
IDPedido INT NOT NULL,
ValorProduto DECIMAL(12,2) NOT NULL
)
INSERT INTO Partitioning (IDEmpregado, IDPedido, ValorProduto)
VALUES (1,10,100.00),
(1,15,350.00),
(1,27,439.00),
(1,74,95.00),
(2,7,550.00),
(2,88,745.00),
(2,32,900.00),
(2,22,23.00),
(3,1,1.00),
(3,100,3.00),
(3,35,45.00),
(3,29,77.00)
SELECT *
FROM dbo.Partitioning
Sendo disponibilizado essas informações então precisamos do seguinte retorno:
É preciso que seja retornado por ID do Empregado (IDEmpregado) o maior valor do produto (ValorProduto).
Para isso sabemos que podemos solucionar esse problema da seguinte forma:
WITH DadosPartitioning AS
(
SELECT IDEmpregado,
IDPedido,
ValorProduto,
RANK() OVER(PARTITION BY IDEmpregado ORDER BY ValorProduto DESC) AS DenseValorProduto
FROM dbo.Partitioning
)
SELECT *
FROM DadosPartitioning
WHERE DenseValorProduto = 1
Sendo assim necessitamos aplicar uma CTE e logo depois do RANK filtrar pelo DenseValorProduto = 1, e com isso teremos o resultados dos empregados e seus respectivos valores.
A Solução Proposta
Pelo novo modelo proposto pelo Itzik, podiamos realizar essa mesmo consulta da seguinte forma:
SELECT IDEmpregado,
IDPedido,
ValorProduto,
RANK() OVER(PARTITION BY IDEmpregado ORDER BY ValorProduto DESC) AS DenseValorProduto
FROM dbo.Partitioning
QUALIFY DenseValorProduto = 1
Aonde quando fosse especificado o QUALIFY ele faria exatamento o papel do filtro de acordo com o particionamento ou ordenãção proposta, economizando assim muito código em T-SQL e aumentando absurdamente a produtividade.
Gostou então vamos torçer para que isso seja implementado algum dia……
Segue o artigo do post escrito por ele explicando detalhadamente isso e o link da discussão sinistra do Microsoft Connect…..
junho 23rd, 2012 → 9:37 pm
[...] Qualify Clause –T-SQL Improvement or Not?. [...]