【问题标题】:postgresql Select all rows which have max value in one columnpostgresql 选择一列中具有最大值的所有行
【发布时间】:2018-10-06 09:59:59
【问题描述】:

我是 postgresql 新手,我在 postgresql 中有一个像这样的表 T:

C1 C2 C3 C4 ID

C1,C2,C4 是整数。
C3 是一个字符 C4 本质上是版本号。并且可以是 1-N 之间的任何值。
(例如,在一组插入事件之后,表中的值被更新。) ID 是一个字符。

问题:
对于给定的 ID 值,我想选择所有与它们关联的 C4 最高的行。例如,表中可能有 N 个版本, 我想要版本 N 对应的所有结果。

我试过了,

select C1,C2,C3, max(C4) from T where ID = 'something';

但它给了我错误。

请指教。

【问题讨论】:

    标签: database postgresql window-functions ranking-functions


    【解决方案1】:

    如果同一版本号可以有多行,则在cte中使用窗口函数RANK,选择rank等于1的行

    SELECT id, c1, c2, c3, c4 
    FROM (
        SELECT 
          *
        , RANK() OVER (PARTITION BY id ORDER BY c4 DESC) c4rank
        FROM t
    ) ranked 
    WHERE c4rank = 1
      AND id = 'something'
    

    如果您想要所有 id 的最新版本,只需从上述语句中省略条件 id = 'something'

    如果给定版本号只能有 1 行,则使用 order by 和 limit 1

    SELECT id, c1, c2, c3, c4
    FROM t
    WHERE id = 'something'
    ORDER BY c4 DESC
    LIMIT 1
    

    如果您想要所有 id 的最新版本,并且每个(id、版本)组合只能有 1 行

    SELECT DISTINCT ON (id) id, c1, c2, c3, c4
    FROM t
    WHERE id = 'something'
    ORDER BY id, c4 DESC
    

    【讨论】:

    • 每个版本和每个文件 ID 将有 M 个条目。所以我想要属于特定 id 和最大/最新版本的所有行。
    • 对于单行查询,我可以将结果保存到 txt 文件中,如下所示:\copy (query) TO '/abc/xyz.csv' (format CSV); 我如何传递这个复杂的大查询由于括号太多而出现语法错误。
    • 这是一个不同的问题,请搜索 SO / google 或提出新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2021-07-23
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多