You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:17:08