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
在标准 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