2014/11/06

GENERANDO TABLA DE NUMEROS

En los últimos meses he aprendido que es importante una tabla de números en secuencia que nos ayudará para muchas cosas y no tenerlas que estar generándolas cada vez que la necesitemos; ahora les mostraré algunas formas de generarlas y después para que podemos utilizarlas.

Usando tablas del sistema :
IF OBJECT_ID('tablaNumeros') IS NOT NULL
 DROP TABLE tablaNumeros 

SELECT TOP 100000 IDENTITY(INT,1,1) AS id
INTO tablaNumeros
FROM master.sys.columns a
 CROSS JOIN master.sys.columns b

SELECT * FROM tablaNumeros


Haciendo cruces de tablas exponencialmente y ordenándolas:
;WITH c0 AS (SELECT 0 g UNION ALL SELECT 0)
-- 2 = SELECT 0 UNION ALL SELECT 0
,c1 AS (SELECT 0 g FROM c0 a CROSS JOIN c0 b) 
-- 4 = 2 x 2 
,c2 AS (SELECT 0 g FROM c1 a CROSS JOIN c1 b) 
-- 16 = 4 x 4
,c3 AS (SELECT 0 g FROM c2 a CROSS JOIN c2 b) 
-- 256 = 16 x 16 
,c4 AS (SELECT 0 g FROM c3 a CROSS JOIN c3 b) 
-- 65,536 = 256 x 256 
,c5 AS (SELECT 0 g FROM c4 a CROSS JOIN c4 b) 
-- 4,294,967,296= 65,536 x 65,536
,tablaNumeros  AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n FROM c5)
SELECT TOP (5349) n
FROM tablaNumeros
ORDER BY n;

Otra forma:
;WITH tablaNumeros (n) AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
SELECT *
FROM tablaNumeros;

Recordemos que a partir de SQL SERVER 2012 ya podemos crear una tabla de valores de la siguiente manera:
SELECT a.*, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
FROM ( VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0) ) AS a(n)


Es por ello que podemos obtener dichos resultados.

Más adelante les mostrare como podemos darle uso a estas tablas de números.


SALUDOS
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario