postgresql 选择一列中具有最大值的所有行

DJ_*_*y_K 2 database postgresql window-functions ranking-functions

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

C1 C2 C3 C4 ID
Run Code Online (Sandbox Code Playgroud)

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

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

我试过,

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

但它给了我错误。

请指教。

Hal*_*Ali 8

如果同一版本号可以有多行,那么RANK在cte中使用窗口函数并选择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'
Run Code Online (Sandbox Code Playgroud)

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

如果给定版本号只能有 1 行,则使用 order by 并限制为 1

SELECT id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY c4 DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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

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