根据另一列的最小值选择一列

syl*_*ian 7 sql postgresql greatest-n-per-group

我有下表。

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
Run Code Online (Sandbox Code Playgroud)

我想选择avg_throughput每个model具有最低firmware_version.

当我这样做时,SELECT test_type, model, min(firmware_version) FORM temp_table GROUP BY test_type, model我得到了我想要的但是一旦我添加了avg_throughput列,它要求我也将它添加到 GROUP BY 子句中,这使得它返回所有行,当我只需要每种类型avg_throughput的最低行时。firmware_versionmodel

a_h*_*ame 6

在标准 SQL 中,这可以使用窗口函数来完成

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;
Run Code Online (Sandbox Code Playgroud)

然而,Postgres 的distinct on运算符通常比带有窗口函数的相应解决方案更快:

select distinct on (test_type, model) 
       test_type, model, firmware_version, avg_throughput
from temp_table
order by test_type, model, firmware_version;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 示例:http ://sqlfiddle.com/#!15/563bd/1