PostgreSQL中使用OVER窗口函数查询每个用户最大index对应记录的方法
PostgreSQL 查询每个用户最大index对应记录的SQL实现
注意:user和index都是PostgreSQL的保留关键字,实际查询时需要用双引号包裹字段名,避免语法报错。
方案1:窗口函数实现(推荐,性能更优)
适合大多数场景,逻辑清晰,查询效率高:
SELECT "id", "user", "index" FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY "user" ORDER BY "index" DESC) AS rank_num FROM 实际表名 -- 替换为你的业务表名 ) AS temp_table WHERE rank_num = 1;
逻辑说明:用PARTITION BY "user"按用户分组,每组内按index倒序排序,每组排序为1的记录就是对应用户index最大的最新记录。如果同一个用户存在多条相同最大index的记录,需要全部返回时,把ROW_NUMBER()替换为RANK()即可。
方案2:关联子查询实现
兼容性更强,不依赖窗口函数特性:
SELECT t1."id", t1."user", t1."index" FROM 实际表名 t1 INNER JOIN ( SELECT "user", MAX("index") AS max_index FROM 实际表名 GROUP BY "user" ) t2 ON t1."user" = t2."user" AND t1."index" = t2.max_index;
逻辑说明:先通过分组聚合查出每个用户的最大index值,再和原表关联匹配,拿到对应最大index的完整记录。
内容的提问来源于stack exchange,提问作者Kawan
相关产品推荐
相关产品推荐

