PostgreSQL中如何筛选各分类下最新出版书籍的行数据
PostgreSQL:筛选各分类下最新出版的书籍行数据
原查询的问题
- 子查询仅返回每个分类的最大出版日期,但未保留对应
category字段,JOIN时无法将日期与分类一一对应,会出现跨分类匹配的错误 - WHERE子句中
add.id是笔误,应为b.id,且硬编码id='id2'违背了“筛选各分类最新书籍”的核心需求 - 未限定JOIN时的分类关联条件,逻辑不完整
正确解法
方法1:使用窗口函数(推荐)
利用ROW_NUMBER()窗口函数按分类分组,对每个分类内的书籍按出版日期倒序排序,取排名为1的行:
SELECT id, title, category, publish_date FROM ( SELECT id, title, category, publish_date, ROW_NUMBER() OVER (PARTITION BY category ORDER BY publish_date DESC) AS rn FROM books WHERE category IN ('c1', 'c2') -- 可选:仅筛选指定分类 ) AS ranked_books WHERE rn = 1;
如果同一分类下有多个书籍在同一天出版(即都是最新日期),想要保留所有这些行,可将ROW_NUMBER()替换为RANK()。
方法2:修正JOIN逻辑(基于你的原始思路)
在子查询中同时返回category和对应的最大出版日期,通过category+publish_date两个字段关联原表:
SELECT b.id, b.title, b.category, b.publish_date FROM books b JOIN ( SELECT category, MAX(publish_date) AS max_pd FROM books GROUP BY category ) AS category_max ON b.category = category_max.category AND b.publish_date = category_max.max_pd WHERE b.category IN ('c1', 'c2'); -- 可选:仅筛选指定分类
说明
- 两种方法都能准确返回每个分类下出版日期最新的书籍行
- 窗口函数的方式更灵活,便于扩展(比如取每个分类前N新的书籍)
内容的提问来源于stack exchange,提问作者anonimos
相关产品推荐
相关产品推荐

