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

PostgreSQL中如何为查询添加额外条件过滤获取最新库存记录

错误原因

你原查询将closing_stock > 0放在全局WHERE条件中,会在分组取最新记录前就过滤掉所有库存为0的条目,导致product_type_id=1分组只能取到次新的2021-11-20的记录,不符合需求逻辑。

正确实现方案

方案1:DISTINCT ON 写法(PostgreSQL专属)

先通过子查询取每个分组的最新记录,再在外层过滤库存大于0的条目即可:

SELECT * 
FROM (
    SELECT DISTINCT ON (product_id, product_type_id) * 
    FROM daily_stock
    WHERE product_id = 2 
      AND product_type_id IN (1, 2, 3)
    ORDER BY product_id, product_type_id, created_dttm DESC
) latest_stock
WHERE closing_stock > 0;

方案2:窗口函数写法(全数据库兼容)

如果需要兼容MySQL、SQL Server等不支持DISTINCT ON的数据库,可以用ROW_NUMBER()窗口函数实现:

SELECT id, product_id, product_type_id, closing_stock, created_dttm
FROM (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY product_id, product_type_id 
               ORDER BY created_dttm DESC
           ) AS rn
    FROM daily_stock
    WHERE product_id = 2 
      AND product_type_id IN (1, 2, 3)
) t
WHERE rn = 1 
  AND closing_stock > 0;
执行逻辑说明

两种写法的核心逻辑一致:

  1. 先不限制库存条件,按product_id、product_type_id分组,取每个分组创建时间最新的1条记录
  2. 对拿到的各分组最新记录做过滤,仅保留库存大于0的条目,自动排除最新记录库存为0的分组,最终得到你期望的结果。

内容的提问来源于stack exchange,提问作者pappu_kutty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:03