Oracle中如何按产品分组筛选对应最大purchase_id的记录?
需求:筛选每个产品对应最大purchase_id的记录
原始表结构与数据
表名:purchase_details
| purchase_id | product_id | purchase_price | sale_price |
|---|---|---|---|
| 3 | 1 | 15000 | 16000 |
| 4 | 1 | 13000 | 14000 |
| 3 | 4 | 500 | 700 |
| 2 | 4 | 400 | 500 |
预期结果
| purchase_id | product_id | purchase_price | sale_price |
|---|---|---|---|
| 4 | 1 | 13000 | 14000 |
| 3 | 4 | 500 | 700 |
方法1:窗口函数(推荐,适配MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()按产品分组,对采购ID降序排序,取每组第一条记录:
SELECT purchase_id, product_id, purchase_price, sale_price FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY purchase_id DESC) AS rn FROM purchase_details ) t WHERE rn = 1;
方法2:子查询关联(兼容低版本数据库)
先分组获取每个产品的最大采购ID,再关联原表提取完整记录:
SELECT pd.* FROM purchase_details pd JOIN ( SELECT product_id, MAX(purchase_id) AS max_purchase_id FROM purchase_details GROUP BY product_id ) t ON pd.product_id = t.product_id AND pd.purchase_id = t.max_purchase_id;
方法3:NOT EXISTS 语句
通过判断当前记录的采购ID是对应产品的最大值来筛选:
SELECT pd1.* FROM purchase_details pd1 WHERE NOT EXISTS ( SELECT 1 FROM purchase_details pd2 WHERE pd2.product_id = pd1.product_id AND pd2.purchase_id > pd1.purchase_id );
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

