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;
执行逻辑说明
两种写法的核心逻辑一致:
- 先不限制库存条件,按
product_id、product_type_id分组,取每个分组创建时间最新的1条记录 - 对拿到的各分组最新记录做过滤,仅保留库存大于0的条目,自动排除最新记录库存为0的分组,最终得到你期望的结果。
内容的提问来源于stack exchange,提问作者pappu_kutty
相关产品推荐
相关产品推荐

