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