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:
Vire isso:
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…
It’s great to read something that’s both enjoyable and provides pragmatisdc sluotonis.