Inicial > Não categorizado > T-SQL Query – NTILE()

T-SQL Query – NTILE()

Hoje recebi no e-mail uma pergunta bem interessante sobre T-SQL…

O desenvolvedor tem um processo bem lento que é executado de acordo com uma faixa inicial e final que são recebidas como parâmetro de entrada para uma procedure.

Ex:

EXEC dbo.st_Process @ID_Inicio = ‘1’, @ID_Fim = ‘10000’

Ou seja, na query acima, o processo irá rodar para os ids 1 até 10000.

Mas o desenvolvedor quer rodar o processo em aproximadamente 50 em 50 ids.

Por exemplo:

EXEC dbo.st_Process @ID_Inicio = ‘1’, @ID_Fim = ’50’

EXEC dbo.st_Process @ID_Inicio = ’51’, @ID_Fim = ‘100’

EXEC dbo.st_Process @ID_Inicio = ‘101’, @ID_Fim = ‘150’

Agora eis a questão. Como fazer para criar uma consulta que pega a tabela, #Tab1 e gera uma lista com os grupos a serem executados?

SET NOCOUNT ON

IF OBJECT_ID(‘tempdb.dbo.#Tab1’) IS NOT NULL

DROP TABLE #Tab1

GO

CREATE TABLE #Tab1 (ID Int IDENTITY(1,1))

GO

INSERT INTO #Tab1 DEFAULT VALUES

GO 10000

SELECT * FROM #Tab1

GO

Preciso que isso:

clip_image002

Vire isso:

clip_image004

Para resolver esta consulta, fiz uma query utilizando o NTILE para quebrar os grupos.

DECLARE @i Int

SELECT @i = COUNT(*) / 50

FROM #Tab1

SELECT Groups, MIN(ID) AS ID_Inicio, MAX(ID) AS ID_Fim

FROM (SELECT NTILE(@i) OVER(ORDER BY ID) AS Groups, ID

FROM #Tab1) AS Tab

GROUP BY Groups

E você? Teria outra solução mais simples? Abraços…

Categorias:Não categorizado
  1. 7 de outubro de 2011 às 17:38

    It’s great to read something that’s both enjoyable and provides pragmatisdc sluotonis.

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: