seleccionando una columna basada en un valor mínimo de otra columna

Tengo la siguiente tabla.

test_type | brand | model | band | firmware_version | avg_throughput -----------+---------+--------+------+-----------------+---------------- 1client | Linksys | N600 | 5ghz | 1 | 66.94 1client | Linksys | N600 | 5ghz | 2 | 94.98 1client | Linksys | N600 | 5ghz | 4 | 132.40 1client | Linksys | EA6500 | 5ghz | 1 | 216.46 1client | Linksys | EA6500 | 5ghz | 2 | 176.79 1client | Linksys | EA6500 | 5ghz | 4 | 191.44 

Me gustaría seleccionar el avg_throughput de cada model que tenga la avg_throughput de firmware_version más baja.

Cuando lo hago SELECT test_type, model, min(firmware_version) FORM temp_table GROUP BY test_type, model Obtengo lo que quiero, pero una vez que agrego la columna avg_throughput , avg_throughput que también lo agregue a la cláusula GROUP BY, lo que hace que devuelva todas las filas cuando todo lo que necesito es solo avg_throughput para la avg_throughput de firmware_version más baja para cada tipo de model .

En SQL estándar, esto se puede hacer usando una function de window

 select test_type, model, firmware_version, avg_throughput from ( select test_type, model, firmware_version, avg_throughput, min(firmware_version) over (partition by test_type, model) as min_firmware from temp_table ) t where firmware_version = min_firmware; 

Sin embargo, Postgres tiene el operador distinct on , que generalmente es más rápido que la solución correspondiente con una function de window:

 select distinct on (test_type, model) test_type, model, firmware_version, avg_throughput from temp_table order by test_type, model, firmware_version; 

Ejemplo de SQLFiddle: http://sqlfiddle.com/#!15/563bd/1

Esto debería ser lo que estás buscando si estoy leyendo tu publicación correctamente, y creo que es una forma bastante fácil de hacerlo. 🙂

 WITH min_firmware_version (model, firmware_version) AS ( SELECT model, MIN(firmware_version) FROM temp_table GROUP BY model ) SELECT temp_table.model, temp_table.firmware_version, temp_table.avg_throughput FROM temp_table INNER JOIN min_firmware_version ON temp_table.model = min_firmware_version.model AND temp_table.firmware_version = min_firmware_version.firmware_version 

Creo que necesitas esa statement SQL:

 SELECT t.test_type, t.model, t.firmware_version, t.avg_throughput FROM temp_table t WHERE t.firmware_version = (SELECT min(firmware_version) FROM temp_table)