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

10

我有以下表格。

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

我想选择每个modelavg_throughput,并且这些model都有最低的firmware_version

当我执行 SELECT test_type, model, min(firmware_version) FORM temp_table GROUP BY test_type, model 时,可以得到我想要的结果,但是一旦我添加了avg_throughput列,就需要将其添加到GROUP BY子句中,这会返回所有行,而我只需要每种model类型中最低firmware_versionavg_throughput

3个回答

9

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

然而,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;

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

这是一个SQLFiddle演示,您可以在其中尝试不同的SQL查询。请点击链接以查看示例。

当我在这里了解到“distinct on”时,我感到非常兴奋,但随后发现Redshift似乎不支持它:( - Gus Melo

1
如果我正确理解了您的帖子,那么这应该是您正在寻找的内容,而且我认为这是一种非常易于阅读的方法。 :-)
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

0

我认为你需要这个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) 

你需要一个相关子查询,否则你会得到整个最小的(firmware_version),而不是外部查询模型的版本。 - user330315
这很接近,但它选择了所有模型的最小版本,但如果每个模型的最小版本不同怎么办?对不起,上面的示例表格不是很清楚。 - sylvian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接