Trucos Transact-SQL - Acerca de una matriz

7 - Acerca de una matriz

[editar]
Tutorial creado por Mononeurona. Extraido de: http://www.mononeurona.org/index.php?idp=541
27 de Octubre de 2005
Supongamos que tenemos dos diferentes tablas y_coord e x_coord que codifican intervalos (por ejemplo, tablas de puntajes, de niveles de comisiones, etc.):

create table y_coord (i int, y float)
create table x_coord (j int, x float)

No interesa en lo más mínimo que y_coord.i (x_coord.j, resp.) sean consecutivos; sólo es necesario que los ordenamientos sean compatibles sobre y_coord.i e y_coord.y (x_coord.j, x_coord.x, resp.), es decir, siempre que y_coord.i < y_coord.i1 es y_coord.y < y_coord.y1.

Además, y esto es lo importante, para cada par (y_coord.i, x_coord.j) existe en la tabla matrix una fila con un valor asociado z:

create table matrix (i int, j int, z float)

La condición fundamental es que matrix = y_coord x x_coord, porque una matriz es una función que tiene como dominio el producto cartesiano del conjunto de índices de filas por el conjunto de índices de columnas.

Ahora bien, los índices sobre matrix no son índices propiamente dichos, sino intervalos: a la i-ésima fila le corresponde el intervalo [y_coord.yi, y_coord.yi+1) semiabierto a la derecha, similarmente para la j-ésima columna.

El problema: dado un punto P = (x, y), encontrar en matrix el valor de z que corresponde al intervalo [xj, xj+1) x [yi, yi+1) al que pertenece P.

Primero pensemos qué significa pertenecer a un intervalo: dada una secuencia ordenada S = {ai}0<=i<N, N > 1 tal que para todo 0 < i <= j < N es ai <= aj, podemos considerarla como una secuencia de intervalos semiabiertos S' = {[ai, ai+1)}0<=i<N-1. Entonces si x pertenece a [ai, ai+1) para algún i, ai es el máximo menor o igual a x, es decir Sup0<=i<N {ai | ai <= x}. De ahí que la consulta obvia sea:

select z from matrix
where i = (select max(i) from y_coord where y <= Y)
and j = (select max(j) from x_coord where x <= X)

Sin embargo, y usando ideas expuestas en la solución de anteriores problemas, hay una forma de hacerlo en Transact-SQL sin hacer uso de consultas anidadas: joins cualificados con having. En vez de buscar el máximo usando un agregado, usamos un having sabiendo que el mínimo grupo es la fila:

select j from x_coord where x <= X having x = max(x)

Con esa idea, y teniendo en cuenta que lo que quiero unir en el join son grupos y no filas, llegamos a la solución eventual:

select z
from y_coord, x_coord, matrix
where y <= Y
and x <= X

having y = max(y)
and x = max(x)
and y_coord.i = matrix.i
and x_coord.j = matrix.j
[editar]

10 opiniones

Agradecimiento.

Interesante eh.
Como hacer los programas.

Todo los programas de sql con todo los programas de php,asp. Deben de ser mas complejas.
Buenisimo.

Felicito a los aportadores de este articulo, pero de igual manera me encantaria que lo ampliasen.
Aprendiendo trasact-sql.

Gracias

por favor quiero encontrar un libro o un tutorial de todo el lenguaje transat-sql

podria por favor colaborarme.
Genial.

Yo había construido una función para agrupar por horas, pero esto es mucho mejor, ya que los cálculos son rapidísimos. Gracias por la idea.
1 2 | siguiente >

Tutoriales relacionados con 'Trucos Transact-SQL'

Varios de los ejemplos aquí presentados usan tablas ''abstractas'' A y B. Las definiciones son:... Más »

Autor y licencia de 'Trucos Transact-SQL'


Tutorial de Mononeurona. Extraido de: http://www.mononeurona.org/index.php?idp=541 CopyLeft
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.