2012-09-26 21 views
6

Mi pregunta es similar a SQL select Group query. Pero hay un cambio en el esquema y deseo un resultado diferente como se menciona a continuación. las soluciones de un enlace dado no me dan las soluciones adecuadas. Puede usar SQL fiddle para resolver esto.SQL seleccionar consulta ayuda requerida

A continuación es mi tabla

Tabla 1

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Samesung | Mobiles | 
| 700 | Micromax | Mobiles | 
| 1000 | Karbonn | Mobiles | 
| 300 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

Ahora quiero mostrar la cantidad de dos más bajo para cada producto y si la cantidad es la misma, entonces cualquiera de acuerdo a orden ascendente alfabeto de la columna de maquillaje .. .

Así que quieren construir consulta SQL individual, que me da resultado como a continuación ..

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

favor me ayude a construir este tipo de consulta ..

+0

posible duplicado de [mysql:? El uso de límite dentro del GROUP BY para obtener resultados por grupo N] (http://stackoverflow.com/questions/2129693/mysql-using-limit-within-group-by-to-get-n-results-per-group). Eche un vistazo a la respuesta aceptada al respecto con un [enlace] (http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in -sql /). – shahkalpesh

Respuesta

1

Esto debería ayudar ..

el primero tenía un error, i t se actualiza ahora.

SELECT t.* 
FROM (
    SELECT @lim := 2, 
      @cg := '' 
    ) vars, 
    (select * from Table1 order by product,amount, make) t 
WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 
    AND (@r := @r - 1) >= 0 
    AND (@cg := product) IS NOT NULL 
ORDER BY 
    product,amount, make 

divertirse con él y con el violinista: http://sqlfiddle.com/#!2/bdd1a/115/0

+0

funciona bien, podría por favor explicarlo brevemente en q o 2 oraciones – mahesh

+0

Tenía un error, está bien ahora. De todos modos, es una implementación para row_number() over (partición por ... orden por ... de oráculo o mssql). Una buena explicación de cómo funciona puede encontrarla aquí http://explainextended.com/2009/03/05/row-sampling/ –

0

probar esta:

select * from table1 ORDER BY amount DESC LIMIT 2; 
+0

Desafortunadamente esto no resuelve el problema de obtener 2 filas por grupo, devolvería 2 filas en total – Darkzaelus

+0

Esto solo devolverá 2 grupos, ¡usted confundió la pregunta completamente! – ssilas777

0
SELECT amount, make,product 
FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY product ORDER BY amount) AS RowID,* 
    FROM Table1) RESULT 
WHERE RowID <= 2 

Esto funciona bien en PostgreSQL, MySQL no soporta la función de ventana, por conseguir un trabajo similar función de intervalo en MySQL refer

+0

da el error: Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '(producto PARTITION BY cantidad ORDER BY) AS RowID, * FROM Table1) RESULTADO DONDE R' en la línea 3: SELECCIONE amount, make, product FROM (SELECT ROW_NUMBER() OVER (PARTITION BY product ORDER BY cantidad) AS RowID, * FROM Table1) RESULTADO DONDE RowID <= 2 – mahesh

+0

oh ... funciona bien con PostgreSQL, – solaimuruganv

+0

yah .. mysql chicos realmente deberían comenzar a implementar las cosas ordenadas en su motores también. –

Cuestiones relacionadas