2011-02-10 126 views
25

Actualmente estoy trabajando en una tarea que requiere una selección que extrae un elemento que contiene un atributo específico de valor máximo en comparación con todos los demás registros. He leído una serie de fuentes en línea que hacen referencia a una función de álgebra relacional "agregada" llamada máxima, pero no describen cómo funciona con los operadores básicos. ¿Cómo se selecciona el atributo que contiene un valor máximo?Agregado álgebra relacional (máximo)

Respuesta

39

Puede expresar funciones agregadas con solo operadores básicos. Es una cosa bonita.

Supongamos que tenemos una tabla T, y nos gustaría encontrar el máximo de su campo de "valor". En primer lugar, debemos tomar el producto cartesiano de T consigo mismo, o más bien con una copia de sí mismo, T2. Luego seleccionamos las filas donde T.value es más pequeño que T2.value: esto nos redirecciona a todas las filas no deseadas, cuyo valor es menor que el valor de alguna otra fila. Para obtener los valores máximos, debemos restar estas filas no deseadas del conjunto de todas las filas. Y eso es. Al menos esa es la idea básica, también necesitamos usar proyecciones para obtener las dimensiones correctas.

Lamentablemente no tengo ni idea de cómo insertar látex aquí, pero usando la notación de álgebra relacional, que sería algo como esto:

π(T.a1...Tan, T.value)(T) 
    - 
π(T.a1...Tan, T.value)(
    σ(T.value<T2.value)(ρ(T, T2) x T) 
) 

donde π es el operador de proyección, - es la diferencia de conjuntos, σ es el operador de selección y ρ es el operador de cambio de nombre.

SQLishly:

SELECT T.* FROM T 
    MINUS 
SELECT T.* FROM T, T as T2 WHERE T.value<T2.value 

Y más práctica:

SELECT T.* FROM T LEFT JOIN T as T2 ON T.value<T2.value WHERE T2.value IS NULL 

Por supuesto, todo esto es en su mayoría sólo de interés académico, es decir, que muestra que el álgebra relacional funciona.

+0

¿te importaría ayudarme en este http://stackoverflow.com/questions/30378663/mysql-querying-aggregate-of-non-overlapping-dates? – exodream

-5

max(columnname) devolverá el valor más alto en la columna columnname.

+0

Entiendo la idea de la función máxima. Más bien, no veo cómo podría reemplazar una llamada a max() con una serie de operadores relacionales básicos. En otras palabras, ¿cómo podría realizar max() llamando solo a SELECT, UNION, etc.? – XBigTK13X

+0

@ XBigTK13X No puedes. –

+4

@Dave, entonces le sugiero que mire de cerca la respuesta de Sat. –

1
table1:= project field (table); 
table2 (fieldrenamed):= project field (table); 
Producted:=table1 mult table2; 
minors:= select fild<fieldrenamed (producted); 
result:=table1 difference (project field(minors)); 

El código corresponde con winRDBI, el campo es el atributo que desea comparar para obtener el valor máximo. La tabla es la tabla original donde está ese campo.

3

Supongamos que tenemos la tabla T con atributos a1, a2, ..., an, v y tenemos que encontrar la fila en la que atribuyen v ha comparado el valor máximo a todas las otras filas.

En primer lugar, necesitamos un producto vectorial de T y T'(una copia de T, donde v fue renombrado a v1) para que podamos comparar los valores de v:

T x ρ{a1, a2, ..., an, v1}T 

en segundo lugar, seleccione las filas donde v < v1, y tenemos todas las filas cuyos v valor es menor que el valor v en al menos otra fila. Éstas son las filas que necesitamos para excluir más adelante:

σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T) 

luego proyectar las columnas con los atributos originales de T (nombres de columna) por lo que tenemos una tabla con el esquema de T, que contiene todas las filas no deseados, que deben ser excluidos de T en el siguiente paso:

π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T)) 

pasado, excluye las filas no deseados de T y obtenemos la fila con el valor máximo v:

T - π{a1, a2, ..., an, v}(σ{v < v1}(T x ρ{a1, a2, ..., an, v1}T)) 

(trabajé esto en base a la respuesta del SAT y las pruebas con Stanford de línea RA course, ya que no entendía muy bien la notación de la SAT, puse la solución en mi notación aquí, en el que las condiciones del operador están en {}. Espero que pueda ayudar a alguien en el futuro)

0

permite que tenemos una relación con un atributo A y valores 1,2,3

A 

1 
2 
3 

por lo que ahora ..

valores del proyecto A y cambiar el nombre de la A1

A1 
1 
2 
3 

de nuevo valores un proyecto y cambiar el nombre con A2

A2 
1 
2 
3 

únete a esto con A2<A1 i.e \join_{A2<A1}
por lo que el - esquema de salida: (entero A2, A1 número entero)

A2<A1 

1|2 
1|3 
2|3 

escuchar siempre los valores A2 será inferior a A1 debido a que join de esa manera (a2<a1)

ahora proyectan A2 la salida es como a continuación

A2 
1 
2 

ahora diff con el atributo original de

A diff A2 

A 
1 
2 
3 

diff 

A2 
1 
2 

de salida es 3 que es el máximo valor

Hola, sé que alguien tiene que ayudar en la edición, para una mejor apariencia

\project_{Att}Relation 

\diff 

\project_{A2}(\rename_{A2}(\project_{Att}Relation) 
       \join_{A2<A1} 
      \rename_{A1}(\project_{Att}Relation)) 
Cuestiones relacionadas