postgresql 版本 13+ 的更新
postgresql最新版本介绍limit ... with ties
SELECT id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY c4 DESC
FETCH 1 ROW WITH TIES
指定WITH TIES
将返回c4
等于该列中最大值的所有行,因此不需要具有窗口函数的单独 CTE。如果只有 1 行c4
具有最大值,则仅返回 1 行。
原始答案(对于早期版本的 postgresql):
如果同一个版本号可以有多行,那么RANK
在cte中使用window函数,选择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, version) 组合只能有 1 行
SELECT DISTINCT ON (id) id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY id, c4 DESC