El Problema
Se quiere tener una tabla que presente los siguientes datos (por ejemplo)
Dato |
4 |
5 |
6 |
7 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
. |
. |
Anteriormente en el artículo [Code] Cómo generar N Filas Rápido Sql Server , se presentan técnicas para generar una tabla de N filas rápidamente la cual usaremos para desarrollar el algoritmo, en la primera parte se tiene la tabla base, generada de la siguiente manera:
declare @CantidadRegistros int, @ValorEnQueSeReInicia int, @IniciaEn int set @CantidadRegistros = 30 --Valor Prueba set @ValorEnQueSeReInicia = 7 set @IniciaEn = 4 -------------------- declare @IdTabla table (Id int, Periodo int default (0)) insert into @IdTabla(Id) select i + @IniciaEn from dbo.fnGenTable(0,@CantidadRegistros,1) genTable select * from @IdTabla
Hasta éste punto se logra tener una tabla con la cantidad de registros que se quieren generar, se agrega una columna llamada Periodo que contendrá el valor final repitiendo el intervalo, para obtener el valor por cada fila se usará una técnica consignada en el artículo [Code] Cómo calcular un total acumulado Rápido SIN Cursores
declare @CurrentId int = @IniciaEn - 1 update @IdTabla set @CurrentId = Periodo = case when @CurrentId = @ValorEnQueSeReInicia then 1 else @CurrentId+1 end select * from @IdTabla
Con el bloque de código anterior se insertan actualizan los registros dependiendo del valor que tenga y si necesita reuniciarse se hace en el case del Update, el código final:
declare @CantidadRegistros int, @ValorEnQueSeReInicia int, @IniciaEn int set @CantidadRegistros = 30 --Valor Prueba set @ValorEnQueSeReInicia = 7 set @IniciaEn = 4 -------------------- declare @IdTabla table (Id int, Periodo int default (0)) insert into @IdTabla(Id) select i + @IniciaEn from dbo.fnGenTable(0,@CantidadRegistros,1) genTable declare @CurrentId int = @IniciaEn - 1 update @IdTabla set @CurrentId = Periodo = case when @CurrentId = @ValorEnQueSeReInicia then 1 else @CurrentId+1 end select * from @IdTabla
Los comentarios son bienvenidos, espero sea de ayuda,