2011-07-28 15 views
12

OK, así que he buscado las otras soluciones sin ayuda. Entonces esto es lo que estoy tratando de hacer. Necesito seleccionar la fila con varias columnas donde el valor en una columna es el valor máximo.SQL Selección de múltiples columnas basadas en el valor máximo en una columna

aquí es datos de la muestra

orderfileid item number item cost warehouse 
    1   1234  3.45    ATL 
    1   2345  1.67    DFW 
    3   2345  2.45    NYY 
    3   678   2.4    ORD 
    2   1234  1.67    DFW 

necesito para seleccionar toda la fila en la que orderfileid es el máximo para cada número de artículo único

el conjunto de datos devuelto debe ser similar

orderfileid item number item cost warehouse 
    2   1234  1.67    DFW 
    3   2345  2.45    NYY 
    3   6789  2.4    ORD 

Creo que probé todas las combinaciones de Select max (orderfileid) puedo pensar en

Cualquier ayuda se apruebe. gracias

+0

algo entre las líneas de: 'select item_number distinta, orderfileid, ITEM_COST, almacén de pedidos por orden item_number, quizá orderfileid desc' ? – PtPazuzu

Respuesta

14

Necesita encontrar sus valores MAX en una subconsulta, luego use esos resultados para unirse a su tabla principal y recuperar las columnas.

SELECT t.OrderFileId, t.ItemNumber, t.ItemCost, t.Warehouse 
    FROM YourTable t 
     INNER JOIN (SELECT ItemNumber, MAX(OrderFileId) AS MaxOrderId 
         FROM YourTable 
         GROUP BY ItemNumber) q 
      ON t.ItemNumber = q.ItemNumber 
       AND t.OrderFileId = q.MaxOrderId 
+0

Gracias. Al probar esta solución, obtengo resultados diferentes. Tal vez estoy escribiendo algo incorrecto, pero obtengo solo el valor con una entrada única. Obtengo los resultados para el número de artículo 6789 y no para los demás. Por supuesto, no estoy usando este conjunto de datos simplificado que tengo en el ejemplo, por lo que puede estar perdiéndolo en la traducción –

+0

@larry: He confirmado que la consulta que he escrito arroja los resultados esperados para el conjunto de datos de muestra que proporcionó. –

+0

Gracias, continuaré modificando y le haré saber los resultados. Gracias por llevarme al próximo paso. –

2
select 
    t.* 
from 
    table t 
    inner join (
     select itemnumber, max(orderfileid) maxof 
     from table 
     group by itemnumber 
    ) m on t.itemnumber = m.itemnumber 
      and t.orderfileid = m.maxof 
0

Trate

SELECT * FROM `TABLE` WHERE orderfileid=(select max(orderfileid) from TABLE) 
+3

No. Está seleccionando 'max (orderfileid)' para toda la tabla, no por número de artículo. –

+0

Oh, claro, ahora lo entiendo, ¡leí completamente esa pregunta! –

-2

Creo que lo que busca es la cláusula "que tiene". Eche un vistazo al this.

seleccione orderfileid, max (itemnumber), itemcost, almacén de MyTable group por orderfileid having max (itemnumber);

+0

Tener es una evaluación posterior al proceso y casi siempre será subóptimo. – Konchog

0

puede hacer referencia a un problema similar en la forma de las cosas usando la partición y recogiendo uno por partición en MySQL grupo

Deleting Rows: No Single Member Has More Than x Records

esto es algo similar a hacer fila más en Oracle. mi publicación anterior fue para oráculo. mi malo ...

+0

MySQL no tiene funciones de ventana. –

0

Ni siquiera usaría Max. Sólo se combinan GROUP BY y ORDER BY

SELECT * FROM orders GROUP BY item_number ORDER BY orderfileid DESC 

entonces por un mínimo cambio justo a ASC

+1

No porque OP solo quiere 1 de cada elemento, no todas las instancias del artículo ordenado por el campo de pedido. NOTA: Estoy justificando el Necro, porque la respuesta es un Necro –

Cuestiones relacionadas