【问题标题】:selecting a column based on a minimum value of another column根据另一列的最小值选择一列
【发布时间】:2014-10-05 21:02:08
【问题描述】:

我有下表。

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

我想从每个model 中选出firmware_version 最低的avg_throughput

当我执行SELECT test_type, model, min(firmware_version) FORM temp_table GROUP BY test_type, model 时,我得到了我想要的,但是一旦我添加了avg_throughput 列,它还需要我将它添加到 GROUP BY 子句中,这样当我只需要 @ 时,它就会返回所有行987654327@ 对于每个 model 类型的最低 firmware_version

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

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

    【讨论】:

    • 您需要一个相关的子查询,否则您会从外部查询中获得总体 min(firmware_version) 而不是模型的那个
    • 这很接近,但它为所有型号选择了最低版本,但如果每个型号的最低版本不同怎么办?抱歉,上面的示例表在这里不是很清楚。
    【解决方案2】:

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

    【讨论】:

    • 当我在这里了解到“distinct on”时,我非常兴奋,然后发现 Redshift 似乎不支持它:(
    【解决方案3】:

    如果我正确阅读了您的帖子,这应该是您正在寻找的内容,而且我认为这是一种非常容易阅读的方式。 :-)

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2021-05-25
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2012-05-29
      • 2021-07-25
      相关资源
      最近更新 更多