Qualify Clause –T-SQL Improvement or Not?

Posted on junho 22, 2012

1


 

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

 

image

 

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

 

image

 

 

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…..

 

http://www.sqlmag.com/blog/puzzled-by-t-sql-blog-15/tsql/qualify—request-for-a-new-filtering-clause-136827

 

http://connect.microsoft.com/SQLServer/feedback/details/532474/qualify-request-for-a-new-filtering-clause