Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Tutoriales / Trucos Transact-SQL - Búsqueda de la mínima vacante

Trucos Transact-SQL - Búsqueda de la mínima vacante

 ***** (10 opiniones)
Creative Commons Tutorial de Mononeurona - 27 de Octubre de 2005
Temas Relacionados: SQLSQL Server
6. Búsqueda de la mínima vacante
Problema: Una tabla tiene un campo numérico que tiene valores en secuencia, pero algunos faltan. Quiero una consulta que me de el primer "agujero" o vacante en la columna.

Un primer acercamiento es seleccionar todos los valores que no pertenecen a la tabla cuyos valores tienen su sucesor inmediato en la misma tabla. Por ejemplo, si la tabla tiene los valores 1, 2, 3, 5, y 7, entonces 1 y 2 tienen su sucesor presente en ella, y 3, 5 y 7 no. Entonces, si 3 no tiene sucesor, 3 + 1 = 4 no está. En SQL:

select a+1 from A
where a not in (select x.a from A x, A y where y.a = x.a+1)

Ahora bien, hay una solución mejor, usando outer joins. La idea es buscar todos los pares de números en la tabla junto con su sucesor, si es que existe. Si no existe, entonces tenemos el valor que buscamos, menos uno:

select isnull(0*y.a,x.a+1) from A x, A y
where x.a *= y.a-1

Si x.a = y.a-1, y.a es el sucesor no nulo de x.a, por lo tanto 0 * y.a = 0. Si no existe y.a sucesor de x.a, y.a es NULL, 0 * y.a = NULL y por lo tanto el resultado del isnull es x.a+1, es decir, la vacante.

Pero nuestro problema original era encontrar la mínima vacante, el mínimo de entre los sucesores que no existen; y el problema es encontrar alguna manera de filtrar el 0. La función que devuelve H cuando z = 0, y 0 si no, es H*(1 - abs(sign(z))); si sabemos que z es no negativo, la función se simplifica a H*(1 - sign(z)). Si H es lo suficientemente grande, nos aseguramos de que min() elegirá sólo los valores que nos interesan; por ejemplo, podemos usar el máximo número positivo representable en un int. Usando H = 231-1 = 2147483647, nuestra consulta es:

select min(2147483647 * (1 - sign(z)) + z)
from A x, A y
where x.a *= y.a-1

donde z = isnull(0*y.a,x.a+1) es la solución que buscamos.

Notar de paso que la suma no genera overflow aritmético.
Autor y licencia de 'Trucos Transact-SQL - Búsqueda de la mínima vacante'
Mononeurona Extraído de: http://www.mononeurona.org/index.php?idp=541

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Este trabajo está licenciado bajo la Creative Commons License. 1999-2005 © :: MonoNeurona.org ::
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Trucos Transact-SQL - Búsqueda de la mínima vacante'

Desde que existe la publicidad, los mercadologos hemos tratado de identificar a nuestros clientes reales... Más »
Recopilación de algunos trucos que todo hacker tiene que saber.
Diferentes trucos para sacar todo el partido al Messenger y manejarlo a nuestro antojo.
Pequeños trucos que mejoran y agilizan el uso de Windows XP.
Esta guía tiene por objetivo dar respuestas muy claras y concretas a los problemas que... Más »
¿Estás seguro de que deseas eliminar este capítulo?