2010-01-30 12 views
7

Tengo una tabla como la siguiente:¿Cómo puedo agrupar por valor mínimo en un campo de tabla, manteniendo todos los valores de esa misma fila?

Field1 | Field2 | Field3 
1  | 1  | 22 
1  | 2  | 10 
2  | 5  | 40 
2  | 2  | 55 

que desea agrupar por Campo1, y luego tomar los valores del resto de la fila con el mínimo Campo2, por ejemplo:

Field1 | Field2 | Field3 
1  | 1  | 22 
2  | 2  | 55 

Tenga en cuenta que esto no es lo mismo que seleccionar el mínimo de cada fila, lo que daría:

Field1 | Field2 | Field3 
1  | 1  | 10 
2  | 2  | 40 

Que con mis datos sería un resultado sin sentido.

¿Alguien tiene una solución general (es decir, una base de datos múltiple) para esto? ¡Estoy seguro de que debe ser un problema resuelto!

Realmente podría hacer con una solución que funciona tanto en sqlite como en ms-access, y el servidor sql sería una ventaja.

Respuesta

12

Tendrá que ejecutar esto con subconsultas.

Select * from 
yourtable t 
    inner join 
    ( Select field1, min(field2) as minField2 
     from yourtable 
     group by field1 
    ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2 

Ahora, si tiene varias filas de un valor mínimo campo2, entonces usted tendrá engañados ... Si no desea que (es decir, desea que el valor mínimo de field3 para cada valor mínimo de campo2), en ese caso, se necesitaría otro sub consulta:

Select outert.field1, outert.field2, outert.field3 
from yourtable outert 
inner join 

( 
Select t.field1, xx.minfield2, min(field3) as minfield3 from 
yourtable t 
    inner join 
    ( Select field1, min(field2) as minField2 
     from yourtable 
     group by field1 
    ) xx 
    on t.field1 = xx.field1 and t.field2 = xx.minfield2 
group by t.field1, xx.minfield2 
) outerx 
on outerx.field1 = outert.field1 
and outerx.field2 = outert.minfield2 
and outerx.field3 = outert.minfield3 
+0

Una advertencia sobre esto, si 'xx.field1' y' xx.minfield2' pueden coincidir con más de una fila en 'yourtable', por ejemplo, si field1 no es un valor clave, esto podría producir resultados involuntarios, es decir, múltiples filas por ocurrencia de campo1 en la tabla de unión. Si 'field1' y' minfield2' pueden producir de manera confiable solo una fila, entonces esto funciona bien. Gracias :) – pseudocoder

5

Como se puede ver hay una solución que funciona mediante SQL único estándar, pero es largo y complicado.

Tenga en cuenta que también es posible escribir un "¡Hola, mundo!" programa que funciona correctamente en tres lenguajes de programación diferentes. Sin embargo, hacer esto generalmente no agrega ningún valor a tu programa. Es mucho más fácil escribir el programa tres veces, adaptado a la sintaxis específica de cada idioma.

Creo que con SQL a menudo es mejor olvidarse de intentar encontrar una solución que funcione en todos los RDBMS y utilizar las extensiones de fabricante y modismos específicos que facilitan las consultas como esta. Por ejemplo, en MS SQL Server, se podría hacer algo como esto:

SELECT Field1, Field2, Field3 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn 
    FROM table1 
) AS T1 
WHERE rn = 1 

De todos modos, ya tiene una solución general, por lo que sólo pensé que ofrecería este punto de vista alternativo.

+0

Entiendo que estoy haciendo una barra para mi espalda con el sql, pero una vez que la he escrito una vez que está hecha, puedo usarla en varios lugares diferentes en mi proyecto actual. – mavnn

+1

Además, preferiría no vincularme a SQL específico de acceso (que es donde actualmente están los datos) ya que estoy tratando de persuadir a los poderes para mover los datos a sqlite o SQL Server. – mavnn

Cuestiones relacionadas