2012-10-02 158 views
10

Estoy tratando de crear una consulta en una tabla que tiene unos 500,000 registros y unas 50 o 60 columnas. Lo que necesito es cotejar estos registros en grupos y seleccionar el registro máximo en cada grupo.MySQL seleccionando el registro máximo en el grupo por

Para simplificar el problema que tengo una tabla de la siguiente manera

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

El grupo simple es el siguiente

select * from temp GROUP BY group_id 

que devuelve

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
+----+-------------+----------+--------+ 

bonita, pero no lo que yo quiero . Lo que quiero es el registro completo de max enternal_id en cada grupo. En otras palabras

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

De alguna manera estoy mirando para poner una declaración max (external_id) en aquí para filtrar lo que se necesita, pero hasta ahora todo mi investigación ha fallado. Alguna guía sería apreciada. Es importante que al devolver el max (external_id) se seleccione todo el registro ya que la columna de ruta difiere.

+0

Tal vez usando "SELECT MAX (external_id) AS máxima, * del grupo temp POR group_id" se puede hacer esto. – PiLHA

Respuesta

19

mucha información en http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Esto siempre ha sido un problema molesto en MySQL. Ha habido formas de evitarlo, como concatenar varios campos juntos (comenzando con external_id), y luego seleccionar el MAX() de eso, y luego volver a separarlo.

Le sugiero que utilice una tabla derivada. La primera tabla (t1) se deriva de una consulta simple en la que identifica el MAX(external_id), luego se une para obtener el resto de los datos.

esto es sólo si external_id es único

SELECT 
    t1.group_id, some_table.id, some_table.mypath 
FROM 
    (
     SELECT group_id, MAX(external_id) AS external_id 
     FROM some_table 
     GROUP BY group_id 
    ) as t1 
INNER JOIN 
    sometable ON t1.external_id = sometable.external_id 
WHERE ... 
+0

Sí, tienes toda la razón. Cambiar el problema es la mejor manera, debería haber seguido la regla "si tienes un problema que no puedes resolver, cámbialo por uno que puedas". Con índices adecuados, funciona bien. – user1715656

+0

Pregunta menor, pero ¿hay alguna razón por la que elige seleccionar t1.group_id en lugar de some_table.group_id? ¿Es más eficiente? –

Cuestiones relacionadas